関数について少し調べて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_like
regexp に従って文字列全体に一致することを期待しますが、代わりに、特定の例では 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:]]+$'