1

Oracle 10gの文字クラスにa-または aを含むエントリを除外しようとして Oracle 10g を使用しています。_ダッシュまたはアンダースコアを含むエントリは、次の方法で見つけることができます。

WITH example
     AS (SELECT 'AAAA-1' n FROM DUAL
         UNION
         SELECT 'AAAAA_1' FROM DUAL
         UNION
         SELECT 'AAAA' FROM DUAL)
SELECT *
  FROM example
 WHERE REGEXP_LIKE (n, '[_\-]')

NOT を使用してうまくいくことはわかっていますが、キャレットでこれを否定するにはどうすればよい(^)ですか? [^_\-]すべてを返すもの、 [^[_\-]]何も返さないもの、[^(_\-)]無効なものを試しました。

4

3 に答える 3

0

私はおそらく、より明確な NOT regexp_like を使用します。しかし、あなたがNOTを使いたくないと言ったので、私はおそらくこれを使うでしょう(繰り返しますが、より明確なimo):

select 'Does NOT contain dash or underscore' as val
from dual 
where regexp_instr('ABC123', '[-_]') = 0;

近いうちに約 20 の異なる正規表現バージョンが作成されると思います ;-)

空の文字列 (null) の特別な扱いが気になる場合は、単純な nvl を使用します。

nvl(regexp_instr('', '[-_]'),0) = 0; 

regexp_like を使用するとこれが許可されないため、これについて言及します (nvl は関係演算子ではありませんが、この場合は instr を数値と比較しているため、instr (左側) 部分で nvl を使用できます。

ただし、これは、ヌル内の一部の文字の存在または非存在について何か言いたいかどうかによって異なります;-)

于 2013-05-17T15:50:52.643 に答える
0
WITH example
     AS (SELECT 'AAAA-1' n FROM DUAL
         UNION
         SELECT 'AAAAA_1' FROM DUAL
         UNION
         SELECT 'AAAA' FROM DUAL
         UNION
         SELECT 'AAAA\1' FROM DUAL
         )
SELECT *
  FROM example
 WHERE REGEXP_LIKE (n, '^[^_-]*$')

フィドル

于 2013-05-17T15:54:22.803 に答える