복붙노트

[SQL] 수있는 "IN"연산자를 사용 오라클에서 LIKE-와일드 카드 (%)?

SQL

수있는 "IN"연산자를 사용 오라클에서 LIKE-와일드 카드 (%)?

나는이 질문을 검색,와 MySQL에서 답을 찾았지만이는 문이 오라클로 건너에 실패하는 사건 중 하나입니다했다.

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

나는의 법적 상당을 찾을 싶습니다

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

어떤 도움을 주셔서 감사합니다

해결법

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

    1.

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

    2.당신이 너무 정규 표현식 사용할 수있는 것

    당신이 너무 정규 표현식 사용할 수있는 것

    NOT REGEXP_LIKE (필드, '^ 완료 | ^ 완료')

    나는이 비록 수행하는 방법을 잘 모르겠어요 ... 여기 참조

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

    3.이것은 당신이 찾고있는 무엇에 맞게 나타납니다 https://forums.oracle.com/forums/thread.jspa?threadID=2140801

    이것은 당신이 찾고있는 무엇에 맞게 나타납니다 https://forums.oracle.com/forums/thread.jspa?threadID=2140801

    기본적으로, 당신이 오라클에 내장 아무것도 거기에 표시되는 정규 표현식을 사용해야합니다.

    나는 스레드에서 예제를 꺼내 당신의 목적을 변환. 그래서 그 힘의 필요 불통 :하지만, 정규식의 빨아

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

    4.당신은 그러나 종류 그 일의 내부 아웃 방식의, 찾고 있던 것을 100 % :

    당신은 그러나 종류 그 일의 내부 아웃 방식의, 찾고 있던 것을 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>
    
  5. ==============================

    5.다소 뒤얽힌, 그러나 :

    다소 뒤얽힌, 그러나 :

    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;
    

    이것은 매우 독특한 문제에 대한 해결책 이었지만, 사람을 도움이 될 수 있습니다. 본질적으로 "처럼"문이없는 나는이 "와 같은에서"빠른 동적를 만들기 위해 만든 있도록 열의 첫 번째 variable_n 문자에 대한 인덱스를 얻을 수있는 방법이 없었다 SSRS에 사용.

    ( '진행 중' '를 제외하고 완료' '완료') 목록의 내용이 변수가 될 수 있습니다.

  6. ==============================

    6.질문에서 언급 한 불법 구문과 가장 가까운 법률 것과 동일합니다 :

    질문에서 언급 한 불법 구문과 가장 가까운 법률 것과 동일합니다 :

    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의 대답 @ 모두 (단지 auxiliar sys.whatever 테이블이 아닌 다른 소스를 선택하여) 동적 목록 패턴을 가능하게한다.

    우리가 (처음부터이 아닌) 패턴의 내부 문자열을 검색했고 경우 주 데이터베이스는, = '진행 중 완료'를 예를 들어 상태를 포함 내 솔루션 (수정이 좋아하는 '%'|| patterns.column_value || '%') 여전히 주어진 레코드에 대해 하나 개의 행을 생성하는 것, whileas Sethionic의 솔루션 @ 각 패턴의 선두로부터 여러 행을 생산하는 것 (다른 auxiliar에 수정은 전에 가입). 더 나은 어떤 판단하지, 단지 차이점을 인식하고 더 나은 적합 당신의 필요를 선택합니다.

  7. from https://stackoverflow.com/questions/9540087/can-the-in-operator-use-like-wildcards-in-oracle by cc-by-sa and MIT license