web-dev-qa-db-ja.com

「IN」演算子は、OracleでLIKEワイルドカード(%)を使用できますか?

私はこの質問を検索し、MySQLで答えを見つけましたが、これは、ステートメントがOracleに渡らないというインシデントの1つです。

「IN」MySQLステートメントでワイルドカードを使用できますか?
私の質問と私がやりたいことをかなりまとめていますが、Oracleでは

私は法的に同等のものを見つけたい

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

助けてくれてありがとう

23
Matt
Select * from myTable m
where m.status not like 'Done%' 
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'
15
CFL_Jeff

正規表現も使用できるようです

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

しかし、これがどの程度うまく機能するかはわかりません... here を参照してください

10
Sebastian Piu

これはあなたが探しているものに合うように見えます: 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^)')
4
Justin Pihony

あなたが探していた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>
3
Tebbe

やや複雑ですが、:

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」を作成するためにこれを作成しました。

リストの内容(「完了」、「終了以外」、「進行中」)は可変です。

1
Sethionic

問題の言及されている違法な構文に最も近い法的同等物は次のとおりです。

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の前に別の補助結合に変更)は、パターンが発生するたびに複数の行を生成します。どちらが優れているかを判断せず、違いを認識し、ニーズに合ったものを選択してください。

0