を探しています
「HouseMD」(2004)
その後は何でも。試しましたが where id~'"House M\.D\." \(2004\).*';
、一致するものがありません
これは機能id~'.*House M.D..*2004.*';
しますが、少し遅いです。
を探しています
「HouseMD」(2004)
その後は何でも。試しましたが where id~'"House M\.D\." \(2004\).*';
、一致するものがありません
これは機能id~'.*House M.D..*2004.*';
しますが、少し遅いです。
デフォルトで非標準準拠のCエスケープのようなモードで文字列を解釈する古いバージョンのPostgreSQLを使用していると思われるため、バックスラッシュはエスケープとして扱われ、消費されます。試してみてくださいSET standard_conforming_strings = 'on';
。
文字列定数に関する字句構造のドキュメントに従って、次のいずれかを実行できます。
オンになっていることを確認しstandard_conforming_strings
ます。この場合、一重引用符を2倍にする必要があります(つまり、'
になります''
)が、円記号はエスケープとして扱われません。
id ~ '"House M\.D\." \(2004\)'
非標準のPostgreSQL固有のE''
構文を使用し、円記号を2倍にします。
id ~ E'"House M\\.D\\." \\(2004\\)'
PostgreSQLバージョン9.1以降はデフォルトで設定standard_conforming_strings
されています。ドキュメントon
を参照してください。
コードをテストした後、古いバージョンでオンにする必要があります。これにより、後で更新するのがはるかに簡単になります。でグローバルに、、でpostgresql.conf
ユーザーごとのレベルでALTER ROLE ... SET
、でデータベースごとのレベルで、ALTER DATABASE ... SET
またはでセッションレベルでオンにすることができますSET standard_conforming_strings = on
。SET LOCAL
トランザクションスコープ内に設定するために使用します。
正規表現は問題ないようです
CREATE OR REPLACE FUNCTION public.regexp_quote(IN TEXT)
RETURNS TEXT
LANGUAGE plpgsql
STABLE
AS $$
/*******************************************************************************
* Function Name: regexp_quote
* In-coming Param:
* The string to decoded and convert into a set of text arrays.
* Returns:
* This function produces a TEXT that can be used as a regular expression
* pattern that would match the input as if it were a literal pattern.
* Description:
* Takes in a TEXT in and escapes all of the necessary characters so that
* the output can be used as a regular expression to match the input as if
* it were a literal pattern.
******************************************************************************/
BEGIN
RETURN REGEXP_REPLACE($1, '([[\\](){}.+*^$|\\\\?-])', '\\\\\\1', 'g');
END;
$$
テスト:
SELECT regexp_quote('"House M.D." (2004)'); -- produces: "House M\\.D\\." \\(2004\\)