2

これが私のクエリです

SELECT producer FROM producers WHERE producer REGEXP CONCAT('[[:<:]]', 'dell\'', '[[:>:]]') 

ここで別の例の単語境界を使用するために、mysql like をこれに置き換えました。しかし、エスケープされたアポストロフィに問題があり、一致してもデータベース内でデルが見つかりません。

4

2 に答える 2

2
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 クラスの英数字またはアンダースコア ( _) です。

は単語の文字ではないため'、単語の末尾になることはできないため、[[:>:]]一致しません。

于 2012-08-02T12:30:28.563 に答える
0

私は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,'[[:>:]]'); 終わり;

于 2015-10-03T12:20:11.433 に答える