在PostgreSQL中如何转义括号

6
我有以下SQL命令,需要在PostgreSQL中转义括号,我该如何操作?
SELECT rua 
  FROM logradouros 
 WHERE rua ~* 'Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)' 
 LIMIT 100;
6个回答

4

使用反斜杠来转义括号。请注意,如果 standard_conforming_strings 参数被设置为 off(这是 PostgreSQL 9.1 及以前的默认行为),你需要使用两个反斜杠 \\

通常有三种方法可以转义括号:

  • 普通的 'pattern' 语法,它依赖于 standard_conforming_strings 设置
  • 转义字符串常量,例如 E'pattern'
  • 美元引号字符串常量 $$pattern$$$sometext$pattern$sometext$

第一种方法是标准 SQL(特别是与 standard_conforming_strings 结合使用),其他方法是 PostgreSQL 的扩展。选择你喜欢的任何方法。

以下是一些示例:

SET standard_conforming_strings = 0;

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
'Antonio De Sant\'Ana Galvao Av Frei \\(Av 01 Parte A\\)'

SET standard_conforming_strings = 1;

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
'Antonio De Sant''Ana Galvao Av Frei \(Av 01 Parte A\)'

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
E'Antonio De Sant\'Ana Galvao Av Frei \\(Av 01 Parte A\\)'

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
$$Antonio De Sant'Ana Galvao Av Frei \(Av 01 Parte A\)$$

SET standard_conforming_strings = default;

3

一般来说,美元引用是最好的选择。看下面的例子:

SELECT $STR$Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)$STR$;
-----------------------------------------------------
 Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)
(1 row)

1

0

虽然其他回答都有帮助,但我认为使用引用函数是“正确”的方法。

来自文档

quote_literal(string text) text 返回给定的字符串适当地引用,以在SQL语句字符串中用作字符串文字。嵌入的单引号和反斜杠被正确加倍。请注意,quote_literal在空输入时返回null;如果参数可能为空,则quote_nullable通常更合适。另请参见示例39-1。 quote_literal(E'O\'Reilly') 'O''Reilly'


0
关于正则表达式,你必须在括号前面使用双反斜杠!

E.g.:

select regexp_matches('FOREIGN KEY (user_transaction_id) REFERENCES landing.user_transactions(id)', E'FOREIGN KEY \\((.*)\\) REFERENCES (.*)\\((.*)\\)', 'g');

结果:

"{user_transaction_id,landing.user_transactions,id}"

0

只需使用2个 ' '

select * from games where name = 'Ahmed''s Salah'

反斜杠对我不起作用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接