Oracle IN 절에서 LIKE 사용
다음과 같이 주어진 열에 임의의 수의 값이 포함된 모든 행을 반환하는 쿼리를 작성할 수 있습니다.
Select * from tbl where my_col in (val1, val2, val3,... valn)
하지만 만약에val1
예를 들어, 의 모든 위치에 나타날 수 있습니다.my_col
데이터 유형이 varchar(300)인 경우 대신 다음과 같이 쓸 수 있습니다.
select * from tbl where my_col LIKE '%val1%'
이 두 가지 기술을 결합할 수 있는 방법이 있습니까?열의 자유 형식 텍스트에 나타날 수 있는 30여 개의 가능한 값을 검색해야 합니다.
다음과 같은 방법으로 이 두 문장을 결합하는 것은 효과가 없는 것 같습니다.
select * from tbl where my_col LIKE ('%val1%', '%val2%', 'val3%',....)
select * from tbl where my_col in ('%val1%', '%val2%', 'val3%',....)
여기서 유용한 것은 Postgre에서 사용할 수 있는 술어입니다.SQL
SELECT *
FROM tbl
WHERE my_col LIKE ANY (ARRAY['%val1%', '%val2%', '%val3%', ...])
안타깝게도 Oracle에서는 이러한 구문을 사용할 수 없습니다.다음을 사용하여 정량화된 비교 술어를 확장할 수 있습니다.OR
그러나:
SELECT *
FROM tbl
WHERE my_col LIKE '%val1%' OR my_col LIKE '%val2%' OR my_col LIKE '%val3%', ...
또는 다음을 사용하여 세미 조인을 만듭니다.EXISTS
술어 및 보조 배열 데이터 구조(자세한 내용은 이 질문 참조):
SELECT *
FROM tbl t
WHERE EXISTS (
SELECT 1
-- Alternatively, store those values in a temp table:
FROM TABLE (sys.ora_mining_varchar2_nt('%val1%', '%val2%', '%val3%'/*, ...*/))
WHERE t.my_col LIKE column_value
)
진정한 전체 텍스트 검색을 위해서는 Oracle Text: http://www.oracle.com/technetwork/database/enterprise-edition/index-098492.html 를 참조할 수 있습니다.
A REGEXP_LIKE
대소문자를 구분하지 않는 정규식 검색을 수행합니다.
select * from Users where Regexp_Like (User_Name, 'karl|anders|leif','i')
이 작업은 전체 테이블 스캔으로 실행됩니다. 즉,LIKE or
솔루션입니다. 따라서 테이블이 작지 않으면 성능이 매우 저하됩니다.자주 사용하지 않으면 괜찮을 수도 있습니다.
성능이 필요한 경우 Oracle Text(또는 일부 외부 인덱서)가 필요합니다.
Oracle Text를 사용하여 하위 문자열 인덱싱을 수행하려면 컨텍스트 인덱스가 필요합니다.많은 스마트를 사용하여 큰 문서와 텍스트를 인덱싱하기 위해 만들어졌기 때문에 조금 관여합니다.숫자와 모든 단어("an" "a", 공백 등)의 하위 문자열 검색과 같은 특정 요구 사항이 있는 경우 일부 스마트 항목을 제거하기 위해 사용자 지정 어휘기를 만들어야 합니다.
많은 데이터를 삽입하는 경우, 특히 정기적으로가 아닌 트랜잭션 내에서 인덱스를 업데이트해야 하는 경우 Oracle Text를 사용하면 작업 속도가 빨라지지 않습니다.
아니요, 이러면 안 됩니다.IN 절의 값은 정확하게 일치해야 합니다.선택 항목을 다음과 같이 수정할 수 있습니다.
SELECT *
FROM tbl
WHERE my_col LIKE %val1%
OR my_col LIKE %val2%
OR my_col LIKE %val3%
...
val1, val2, val3...충분히 비슷하므로 REGEXP_LIKE 연산자에서 정규식을 사용할 수 있습니다.
Oracle에서 regexp_like를 다음과 같이 사용할 수 있습니다.
select *
from table_name
where regexp_like (name, '^(value-1|value-2|value-3....)');
줄의 시작 문자를 나타내는 캐럿(^) 연산자 및 OR 연산자를 나타내는 파이프(|) 연산자.
예, 이 쿼리를 사용할 수 있습니다(대신'Specialist'
그리고.'Developer'
하고 "" " " " " 를 변경합니다.employees
에 테이블있음)
SELECT * FROM employees em
WHERE EXISTS (select 1 from table(sys.dbms_debug_vc2coll('Specialist', 'Developer')) mt
where em.job like ('%' || mt.column_value || '%'));
내 보다 더 : 당은필요없습다니이유나신은내질문이.CREATE TABLE
실행 권한.이 작업은 다음과 같이 실행할 수 있습니다.SELECT
허가증
이것은 꽤 빠릅니다.
select * from listofvalue l
inner join tbl on tbl.mycol like '%' || l.value || '%'
@Lukas Eder 답변을 덧붙이자면.
값을 입니다. (는 블을사않개도다니습록있선했수음지하입삽값테할만용이을고들사▁select from dual
그리고.unpivot
결과를 "으로 것:
with all_likes as
(select * from
(select '%val1%' like_1, '%val2%' like_2, '%val3%' like_3, '%val4%' as like_4, '%val5%' as like_5 from dual)
unpivot (
united_columns for subquery_column in ("LIKE_1", "LIKE_2", "LIKE_3", "LIKE_4", "LIKE_5"))
)
select * from tbl
where exists (select 1 from all_likes where tbl.my_col like all_likes.united_columns)
나는 이것을 선호합니다.
WHERE CASE WHEN my_col LIKE '%val1%' THEN 1
WHEN my_col LIKE '%val2%' THEN 1
WHEN my_col LIKE '%val3%' THEN 1
ELSE 0
END = 1
최적이라고 말하는 것은 아니지만 작동하고 쉽게 이해할 수 있습니다.대부분의 쿼리는 임시로 한 번 사용하기 때문에 성능은 일반적으로 문제가 되지 않습니다.
select * from tbl
where exists (select 1 from all_likes where all_likes.value = substr(tbl.my_col,0, length(tbl.my_col)))
ODCIVARCHAR2LIST에 값을 입력한 후 일반 테이블로 참여할 수 있습니다.
select tabl1.* FROM tabl1 LEFT JOIN
(select column_value txt from table(sys.ODCIVARCHAR2LIST
('%val1%','%val2%','%val3%')
)) Vals ON tabl1.column LIKE Vals.txt WHERE Vals.txt IS NOT NULL
https://stackoverflow.com/a/6074261/802058 에 언급된 컬렉션 유형은 필요하지 않습니다.하위 쿼리를 사용합니다.
SELECT *
FROM tbl t
WHERE EXISTS (
SELECT 1
FROM (
SELECT 'val1%' AS val FROM dual
UNION ALL
SELECT 'val2%' AS val FROM dual
-- ...
-- or simply use an subquery here
)
WHERE t.my_col LIKE val
)
언급URL : https://stackoverflow.com/questions/6074201/using-like-in-an-oracle-in-clause
'programing' 카테고리의 다른 글
SQL Server 스키마 이름 바꾸기 (0) | 2023.07.08 |
---|---|
선형 회귀 분석에서 p-값 및 r-값 추출 (0) | 2023.07.08 |
주문 기준 조항에 대한 명세서를 작성한 경우 (0) | 2023.07.03 |
Vuex: 세터가 작동하지 않고 입력이 기록되지 않습니까? (0) | 2023.07.03 |
함수에서 저장 프로시저 실행 (0) | 2023.07.03 |