"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
'programing' 카테고리의 다른 글
파이썬에 해당하는 메이븐 (0) | 2023.06.17 |
---|---|
Trusted_Connection=true 및 SQL Server 인증을 사용하는 경우 성능에 영향을 미칩니까? (0) | 2023.06.17 |
Oracle SQL에 "존재하지 않는 경우 create sequence..."와 같은 것이 있습니까? (0) | 2023.06.17 |
각도 라이브러리 모듈이 추상 클래스를 사용하여 서비스 주입 (0) | 2023.06.17 |
로컬 보석을 설치하려면 어떻게 해야 합니까? (0) | 2023.06.17 |