programing

"IN" 연산자가 오라클에서 LIKE 와일드카드(%)를 사용할 수 있습니까?

minimums 2023. 6. 17. 08:55
반응형

"IN" 연산자가 오라클에서 LIKE 와일드카드(%)를 사용할 수 있습니까?

나는 이 질문을 검색했고 MySQL에서 답을 찾았지만, 이것은 그 진술이 Oracle로 넘어가지 못하는 사건 중 하나입니다.

"IN" MySQL 문에서 와일드카드를 사용할 수 있습니까?
내 질문과 내가 하고 싶은 것을 거의 요약하지만 오라클에서는.

저는 법적으로 동등한 것을 찾고 싶습니다.

Select * from myTable m
where m.status not in ('Done%', 'Finished except%', 'In Progress%')

도와주셔서 감사합니다.

Select * from myTable m
where m.status not like 'Done%' 
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'

regexp도 사용할 수 있을 것 같습니다.

WHERE NOT REGEXP_LIKE(field, '^Done|^Finished')

이 작업이 얼마나 잘 수행될지는 잘 모르겠습니다. 여기를 참조하십시오.

이것은 당신이 찾고 있는 것에 맞는 것으로 보입니다: https://forums.oracle.com/forums/thread.jspa?threadID=2140801

기본적으로 Oracle에는 이를 위한 기본적인 기능이 없기 때문에 정규식을 사용해야 합니다.

나는 스레드에서 예제를 꺼내 당신의 목적을 위해 변환했습니다.하지만 저는 정규식을 싫어하기 때문에 수정이 필요할 수도 있습니다 :)

SELECT  *
FROM myTable m
WHERE NOT regexp_like(m.status,'((Done^|Finished except^|In Progress^)')

원하는 것이 100%가 아니라 일종의 내부적인 방법입니다.

SQL> CREATE TABLE mytable (id NUMBER, status VARCHAR2(50));

Table created.

SQL> INSERT INTO mytable VALUES (1,'Finished except pouring water on witch');

1 row created.

SQL> INSERT INTO mytable VALUES (2,'Finished except clicking ruby-slipper heels');

1 row created.

SQL> INSERT INTO mytable VALUES (3,'You shall (not?) pass');

1 row created.

SQL> INSERT INTO mytable VALUES (4,'Done');

1 row created.

SQL> INSERT INTO mytable VALUES (5,'Done with it.');

1 row created.

SQL> INSERT INTO mytable VALUES (6,'In Progress');

1 row created.

SQL> INSERT INTO mytable VALUES (7,'In progress, OK?');

1 row created.

SQL> INSERT INTO mytable VALUES (8,'In Progress Check Back In Three Days'' Time');

1 row created.

SQL> SELECT *
  2  FROM   mytable m
  3  WHERE  +1 NOT IN (INSTR(m.status,'Done')
  4            ,       INSTR(m.status,'Finished except')
  5            ,       INSTR(m.status,'In Progress'));

        ID STATUS
---------- --------------------------------------------------
         3 You shall (not?) pass
         7 In progress, OK?

SQL>

다소 복잡하지만, 다음과 같습니다.

Select * from myTable m
join (SELECT a.COLUMN_VALUE || b.COLUMN_VALUE status
FROM   (TABLE(Sys.Dbms_Debug_Vc2coll('Done', 'Finished except', 'In Progress'))) a
JOIN (Select '%' COLUMN_VALUE from dual) b on 1=1) params
on params.status like m.status;

이것은 매우 독특한 문제에 대한 해결책이었지만 누군가에게 도움이 될 수도 있습니다.기본적으로 "in like" 문이 없고 열의 첫 번째 variable_n 문자에 대한 인덱스를 가져올 방법이 없었기 때문에 SSRS에서 사용할 빠른 동적 "in like"를 만들기 위해 이 문을 만들었습니다.

목록 내용('완료', '종료됨', '진행 중')은 변수가 될 수 있습니다.

문제의 불법 구문에 가장 가까운 법적 대응은 다음과 같습니다.

select * from myTable m
where not exists (
  select 1
  from table(sys.ku$_vcnt('Done', 'Finished except', 'In Progress')) patterns
  where m.status like patterns.column_value || '%'
)

내 것과 @Sethionic의 대답 모두 패턴을 동적으로 나열하는 것을 가능하게 합니다(보조 소스가 아닌 다른 소스를 선택하는 것만으로도).sys.whatever표)를 선택합니다.

예를 들어 문자열 내부의 패턴(처음부터가 아닌)과 데이터베이스를 검색해야 하는 경우status = 'Done In Progress'그러면 나의 해결책(수정)like '%' || patterns.column_value || '%')는 여전히 주어진 레코드에 대해 하나의 행을 생성하는 반면, @Sethionic의 솔루션(이전의 다른 보조 조인으로 수정됨).a)는 각 패턴 발생에 대해 여러 행을 생성합니다.어떤 것이 더 나은지 판단하지 말고, 단지 차이점을 알고 당신의 필요에 더 적합한 것을 선택하세요.

언급URL : https://stackoverflow.com/questions/9540087/can-the-in-operator-use-like-wildcards-in-oracle

반응형