如何理解 PostgreSQL 中两个邻近的单引号

在 PostgreSQL 中执行如下的 SQL 语句

1
SELECT 'AND c1 = ''' || 5 || '''';

将输出 AND c1 = '5'。我们的疑问是 5 两边的单引号 ' 是怎么得到的?

在官方文档的 4.1.2.1. String Constants 一节中给出了字符串的定义

A string constant in SQL is an arbitrary sequence of characters bounded by single quotes ('), for example 'This is a string'. To include a single-quote character within a string constant, write two adjacent single quotes, e.g., 'Dianne''s horse'.

同时我们从官法文档的 9.4. String Functions and Operators 一节中知道字符串串接操作符 || 可以把两个字符串连接起来得到一个新的字符串,它也可以接收一个非字符串输入,比如数字 5,此时会自动地把非字符串输入转换为字符串再进行串接。

现在再来看前面的 SQL 语句

|| 操作符将 SELECT 子句分为了 3 部分。第 ① 和第 ③ 部分是字符串,第 ② 部分是数字。

第 ① 部分字符串的内容是由下标 0 和 下标 12 处的单引号包围的内容,即 AND c1 = '',下标 10 和下标 11 两个邻近的单引号将输出 5 左边的单引号。第 ③ 部分字符串的内容是由下标 20 和下标 23 处的单引号包围的内容,即 '',下标 21 和下标 22 两个邻近的单引号将输出 5 右边的单引号。

我们来看另一个有趣的例子

1
SELECT 'AND c1 = ''''''';

这个例子将输出 AND c1 = '''。除去首尾的单引号,中间的 6 个单引号 '''''' 每两个邻近的单引号输出一个单引号,我们可以用 / 作为分隔符分割一下 ''/''/'',即第 1 和第 2 个单引号输出结果中的第一个单引号,第 3 和第 4 个单引号输出结果中的第二个单引号,第 5 和第 6 个单引号输出结果中的第三个单引号。