2012-03-02 10 views
22

私はこの質問を検索し、MySQLで答えを見つけましたが、これはOracleにクロスオーバーできない事例の1つです。"IN"演算子はOracleでLIKEワイルドカード(%)を使用できますか?

Can I use wildcards in "IN" MySQL statement?
かなりの合計アップ私の質問をし、私は何をしたいのですが、Oracleの

に私は

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

の法的同等のものを見つけたい任意のヘルプ

てくれてありがとう

答えて

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

私は長い道のりを避けようとしていましたが、唯一の方法かもしれないようです。 – Matt

+0

@Mattこれはちょっと短いSQLテキストを書くことで、この答えで提案されている構文を使用し、 。これが別のテーブルの行をLIKEしている場合(実際には値のリストをあらかじめ作成することはできません)、これはまったく別の問題です。 'JOIN OTHER_TABLE ON NOT(YOUR_TABLE.FIELD LIKE OTHER_TABLE .FIELD) '... –

+0

私はこれを簡単にするために使い終わったが、正規表現の答えはOracleの新しいビットを学ぶ機会として役立った。ありがとうすべて – Matt

4

これはあなたが探しているものに合っています: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^)') 
10

あなたがあまりにも

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

私はこれはしかし実行する方法もわからないんだけど、正規表現を使用できるようです。 ..あなたが探していたものhere

3

ない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> 
1

やや複雑、しかし:

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で使用するための高速ダイナミックな「in」を作成しました。

リストの内容( 'Done'、 'Finished except'、 'In Progress')は可変です。

+0

これは、複数のパターンに対してうまくスケールされるので、これは非常に貴重な答えです。私のユースケースは文字列の中を検索することだったので、私は自分の答えに類似しているが少し単純化された解決策を巻いた。 –

0

問題に言及した不正な構文に最も近い同等合法です:

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テーブル以外のソースを選択することによって)動的にパターンを一覧表示することが可能になります。

注意、我々はwhileas 、その後 (like '%' || patterns.column_value || '%'に変更された)私の解決策はまだ、特定のレコードの1行を生成し、たとえばstatus = 'Done In Progress'のために含まれている(むしろ最初からより)文字列とデータベース内のパターンを検索していた場合@ Sethionicの解決策(aの前に別の補助的結合に変更)は、パターン発生ごとに複数の行を生成します。 どちらが優れているかは判断できません。差異を認識し、ニーズに合ったものを選択してください。

関連する問題