2

を探しています

「HouseMD」(2004)

その後は何でも。試しましたが where id~'"House M\.D\." \(2004\).*';、一致するものがありません

これは機能id~'.*House M.D..*2004.*';しますが、少し遅いです。

4

3 に答える 3

4

デフォルトで非標準準拠の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 = onSET LOCALトランザクションスコープ内に設定するために使用します。

于 2012-10-13T11:20:18.023 に答える
2

正規表現は問題ないようです

http://sqlfiddle.com/#!12/d41d8/113

于 2012-10-13T11:15:35.200 に答える
0
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\\)
于 2012-10-13T15:27:45.473 に答える