복붙노트

[SQL] 오라클 IN 절에서 LIKE를 사용하여

SQL

오라클 IN 절에서 LIKE를 사용하여

나는 주어진 열에서 값의 수를 포함하는 모든 행을 반환하는 쿼리를 작성할 수 있습니다 알고, 그래서 좋아한다 :

Select * from tbl where my_col in (val1, val2, val3,... valn)

VAL1, 예를 들어, 데이터 유형 VARCHAR (300)가 my_col, 어디에서나 나타날 수 있다면, 내가 대신 작성할 수 있습니다 :

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%',....)

해결법

  1. ==============================

    1.

    select * from tbl 
    where my_col like '%val1%' or my_col like'%val2%' or my_col like '%val3%', ...
    

    그러나 아주 천천히 ... 또는, 당신이 테이블에 (% 기호를 포함하여) 모든 가능한 값을 삽입 할 수 있으며, 그 테이블을 반 조인 될 수도 조심 :

    select * from tbl
    where exists (select 1 from all_likes where tbl.my_col like all_likes.value)
    

    사실 전체 텍스트 검색의 경우, 오라클 텍스트를보고 할 수 있습니다 :

    http://www.oracle.com/technetwork/database/enterprise-edition/index-098492.html

  2. ==============================

    2.아니, 당신은이 작업을 수행 할 수 없습니다. IN 절에서 값이 정확하게 일치해야합니다. 당신은이 thusly 히 선택 수정할 수 있습니다 :

    아니, 당신은이 작업을 수행 할 수 없습니다. IN 절에서 값이 정확하게 일치해야합니다. 당신은이 thusly 히 선택 수정할 수 있습니다 :

    SELECT *
      FROM tbl
     WHERE my_col LIKE %val1%
        OR my_col LIKE %val2%
        OR my_col LIKE %val3%
     ...
    

    VAL1, val2만큼, val3 있다면 ... 당신은 REGEXP_LIKE 연산자에서 정규 표현식을 사용할 수도 있습니다 비슷한 충분합니다.

  3. ==============================

    3.REGEXP_LIKE는 대소 문자를 구별하지 정규 표현식 검색을 할 것입니다.

    REGEXP_LIKE는 대소 문자를 구별하지 정규 표현식 검색을 할 것입니다.

    select * from Users where Regexp_Like (User_Name, 'karl|anders|leif','i')
    

    이는 전체 테이블 스캔으로 실행됩니다 - 바로 LIKE 또는 솔루션으로, 테이블이 작지 않은 경우 성능이 정말 나쁜 것 때문에. 이 모든에 자주 사용되어 있지 않은 경우, 그것은 확인 될 수 있습니다.

    성능의 어떤 종류를해야하는 경우, 오라클 텍스트 (또는 외부 인덱서)가 필요합니다.

    오라클 텍스트 문자열 색인을 얻으려면 당신은 CONTEXT 인덱스가 필요합니다. 그것은이 영리를 많이 사용하여 큰 문서 및 텍스트 색인을 위해 만든 것 같은 비트가 참여합니다. 당신은 그런 부분 문자열 수의 검색 및 모든 단어와 같은 특별한 요구가있는 경우 (포함 "은"의 "가", "a"는, 공간 등), 당신은 스마트 재료의 일부를 제거하기 위해 사용자 정의 렉서를 만들 필요가 ...

    당신은 많은 데이터를 삽입하는 경우, Oracle Text는 인덱스가 트랜잭션 내에 업데이트하지 주기적으로해야 특히, 빠르게 일을하지 않습니다.

  4. ==============================

    4.예, 당신은 (당신이 당신의 테이블과 쉼표와 변화 직원 테이블로 구분하여 원하는 문자열을 입력하는 대신 '개발자', '전문가'의 등)이 쿼리를 사용할 수 있습니다

    예, 당신은 (당신이 당신의 테이블과 쉼표와 변화 직원 테이블로 구분하여 원하는 문자열을 입력하는 대신 '개발자', '전문가'의 등)이 쿼리를 사용할 수 있습니다

    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 권한으로 실행할 수 있습니다.

  5. ==============================

    5.이 사람은 꽤 빨리이다 :

    이 사람은 꽤 빨리이다 :

    select * from listofvalue l 
    inner join tbl on tbl.mycol like '%' || l.value || '%'
    
  6. ==============================

    6.

    select * from tbl
     where exists (select 1 from all_likes where all_likes.value = substr(tbl.my_col,0, length(tbl.my_col)))
    
  7. ==============================

    7.그냥 @Lukas 에더의 대답에 추가 할 수 있습니다.

    그냥 @Lukas 에더의 대답에 추가 할 수 있습니다.

    개선점은 값 테이블을 생성 및 삽입 피해야 (우리는 "즉석에서"동일한 결과를 달성하기 위해 듀얼 및 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)
    
  8. ==============================

    8.나는이 선호

    나는이 선호

    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
    

    나는 그것의 최적를 말하고 있지 않다 그러나 그것은 작동하고 쉽게 이해할 수 있습니다. 성능이 저를 위해 일반적으로 문제가되지 않습니다 그래서 내 쿼리의 대부분은 한 번 사용 애드혹 있습니다.

  9. ==============================

    9.당신은 ODCIVARCHAR2LIST에 값을 넣고 일반 테이블로 가입 할 수 있습니다.

    당신은 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
    
  10. from https://stackoverflow.com/questions/6074201/using-like-in-an-oracle-in-clause by cc-by-sa and MIT license