为何将字符串拆分为两行可正常调用PostgreSQL的format()?
PostgreSQL中format()函数的字符串拼接疑问解析
先看format()的基础调用,直接传入完整字符串可以正常返回结果:
postgres=# SELECT format('Hello World'); format ------------- Hello World (1 row)
1. 同一行拆分带空格为何报错?
当把字符串拆成同一行的'Hello '和'World'(中间带空格)时,PostgreSQL的语法解析器会认为这是两个独立的字符串字面量,而PostgreSQL不支持同一行里用空格分隔两个字符串字面量来自动拼接,所以会抛出语法错误:
-- ↓ 一个空格 postgres=# SELECT format('Hello ' 'World'); ERROR: syntax error at or near "'World'" LINE 1: SELECT format('Hello ' 'World');
2. 换行拆分为何能正常运行?
如果把两个字符串字面量拆成两行,PostgreSQL会自动将它们拼接成一个完整的字符串。这是PostgreSQL的语法规则:换行分隔的相邻字符串字面量会被隐式拼接,所以最终传给format()的还是完整的'Hello World',自然能正常返回结果:
postgres=# SELECT format('Hello ' postgres(# 'World'); format ------------- Hello World (1 row)
3. 无空格的情况:单引号转义
当两个字符串之间没有空格时,'Hello ''World'其实是PostgreSQL里的单引号转义写法——两个连续的单引号会被解析成一个普通单引号,所以最终字符串是Hello 'World',传给format()后就会返回这个结果:
-- ↓↓ 无空格 postgres=# SELECT format('Hello ''World'); format -------------- Hello 'World (1 row)
4. 加逗号的情况:format()的参数特性
format()函数的第一个参数是格式字符串,后续参数是用来填充格式占位符的变量。当传入format('Hello ', 'World')时,第一个参数'Hello '里没有任何占位符(比如%s),所以第二个参数'World'会被忽略,最终只输出格式字符串本身:
postgres=# SELECT format('Hello ', 'World'); format -- ↑ 此处 -------- Hello (1 row)
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

