MySQLの REGEX_COUNT
正規表現'^([^、] +、)* your_value(、[^、] +)*$'
を使用 収まります。
次のSQLクエリを調べます(Oracleの場合)...
数字の例
番号1
を検索します セット内: [1,2,3,4,5,6,11,12,13]
SELECT
CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
1
を返します 正しく
番号1
を検索します セット内:[111,222,333]。この場合、INSTRはネガティブを報告できません。
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
0
を返します 正しく
文字列の例
'John'
を検索します 名前のセット:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
1
を返します 正しく
ただし、文字'a'
を検索すると 、正しくゼロを返します(INSTRは再び失敗します)。
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
0
を返します 正しく
私はこの質問がずっと前に答えられたことを知っています、しかしそれは検索結果でよくランク付けされて、そしておそらくオラクルの INSTR
より明白であるがより正しい解決策を探す他の人を助けるかもしれません 機能。
ブール式
OR
などのブール式を使用することもできます。 またはAND
。
OR
を使用した例 は次のとおりです:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
1
を返します 正しく、「peter」が見つかったので(「helen」のいずれかを検索します または"peter" 。
AND
の場合 アプローチは少し異なります(CASE式を修正します) 正規表現の代わりに ):
SELECT
CASE WHEN
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
上記のクエリは、両方の "john"を検索します。 そして 「ピーター」 。 AND
REGEXP_COUNT
を複製することで、操作を簡単に実装できます。 CASE
の式 ただし、構文はわずかなパフォーマンスの低下を伴います。