私はこの質問を検索し、MySQLで答えを見つけましたが、これは、ステートメントがOracleに渡らないというインシデントの1つです。
「IN」MySQLステートメントでワイルドカードを使用できますか?
私の質問と私がやりたいことをかなりまとめていますが、Oracleでは
私は法的に同等のものを見つけたい
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%'
正規表現も使用できるようです
WHERE NOT REGEXP_LIKE(field, '^Done|^Finished')
しかし、これがどの程度うまく機能するかはわかりません... here を参照してください
これはあなたが探しているものに合うように見えます: 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
テーブル)。
パターンinside文字列(最初からではなく)と、たとえばstatus = 'Done In Progress'
、次に私の解決策(like '%' || patterns.column_value || '%'
)は、特定のレコードに対して1行を生成しますが、@ Sethionicのソリューション(a
の前に別の補助結合に変更)は、パターンが発生するたびに複数の行を生成します。どちらが優れているかを判断せず、違いを認識し、ニーズに合ったものを選択してください。