これが私のクエリです
SELECT producer FROM producers WHERE producer REGEXP CONCAT('[[:<:]]', 'dell\'', '[[:>:]]')
ここで別の例の単語境界を使用するために、mysql like をこれに置き換えました。しかし、エスケープされたアポストロフィに問題があり、一致してもデータベース内でデルが見つかりません。
これが私のクエリです
SELECT producer FROM producers WHERE producer REGEXP CONCAT('[[:<:]]', 'dell\'', '[[:>:]]')
ここで別の例の単語境界を使用するために、mysql like をこれに置き換えました。しかし、エスケープされたアポストロフィに問題があり、一致してもデータベース内でデルが見つかりません。
select count(*) from (select 'dell\'' as c) t where c regexp '[[:<:]]dell\''; -- -> 1
select count(*) from (select 'dell\'' as c) t where c regexp '[[:<:]]dell\'[[:>:]]'; -- -> 0
したがって、失敗するのは末尾の境界要件です。これは理にかなっています。ドキュメントからの引用:
これらのマーカーは、単語の境界を表します。それぞれ、単語の先頭と末尾に一致します。単語は、単語文字が前後にない一連の単語文字です。単語文字は、alnum クラスの英数字またはアンダースコア (
_
) です。
は単語の文字ではないため'
、単語の末尾になることはできないため、[[:>:]]
一致しません。
私はUDFを作成し、条件に応じてプレフィックス、サフィックス、および値を設定できる関数を呼び出すだけで問題を解決します。
DROP FUNCTION IF EXISTS pp
$$ CREATE FUNCTION pp
(Slist varchar(100)) RETURNS char(100) CHARSET latin1 BEGIN Declare sregex varchar(100); SET slist = 'G'; return Concat('[[:<:]]',Slist,'[[:>:]]'); 終わり;