2

関数について少し調べてREGEXP_LIKEみましたが、オラクルのウェブサイトで見つけたものは次のとおりです。

REGEXP_LIKE は LIKE 条件に似ていますが、REGEXP_LIKE は、LIKE' によって実行される単純なパターン マッチングの代わりに正規表現の一致を実行します。

ということで、以下の2つを比較してみました。

1)LIKE場合によっては、%_たちは自由に使用できます。

だから、私は実行します:

SELECT 'true' 
  FROM dual 
 WHERE 'true' like '%ru_'; 

期待どおり、出力に「true」が表示されます。

2) REGEXP の場合、実行すると:

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');

また

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', 'u');

どちらの場合でも、結果セットで「true」になります。regexp_likeregexp に従って文字列全体に一致することを期待しますが、代わりに、特定の例では 1 文字のみに一致します。

私も例に挙げられると思います

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');

することが

SELECT 'true' 
  FROM dual 
 WHERE REGEXP_LIKE('true', '[[:alpha:]]+'); 

これは、[[:alpha:]]トークンを複数回適用できることを意味し、正規表現に対して true が一致するようにします。or がない+場合*[[:alpha:]]トークンは「t」である 1 文字のみに一致し、1 つの一致のみが必要なため、一致に失敗した文字はそれ以上一致しません。

私にとって、それは奇妙な振る舞いです。私が間違っている場合は、私を修正してください。ありがとう。

編集:追加メモ:

最初に調べ始めた理由は、名に数字が含まれていないことを確認するための質問で、文字だけであり、模擬試験で次の答えが得られる
.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '^A-Z'))NOVALIDATE; 

B.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '^[0-9]'))NOVALIDATE;

C.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:alpha:]]'))NOVALIDATE; 

D.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:digit:]]'))NOVALIDATE;

彼らはCを正しいとリストしていますが、どれも正しくありません。

以下の回答によると、正しいのは次のように見えます: '^[[:alpha:]]+$'

4

1 に答える 1