使用运算符“||”连接字符串 或 format() 函数

Hum*_*d24 6 postgresql concatenation dynamic-sql

我们应该使用连接运算符||还是format()触发函数中的函数?

使用其中一种相对于另一种是否有任何优势,或者是否取决于个人喜好和可读性?

您是否会说对于简单的串联,使用运算符,但对于更复杂的串联,使用格式函数?

Erw*_*ter 12

基本上有 4 种用于连接字符串的标准工具。最简单/最便宜的优先:

||(标准 SQL 连接运算符)...

  • null如果任何操作数为 则返回null。(可能合意,也可能不合意。)
  • format()比或快一点concat()
  • 允许用最短的语法连接很少的字符串。
  • 对输入类型更加挑剔,因为有多个不同的||运算符,并且输入类型需要明确以便运算符类型解析。
  • 连接字符串类型是IMMUTABLE,这允许它们在索引或其他需要不可变波动性的地方安全使用

concat()...

  • 如果一个参数是则不返回。(可能合意,也可能不合意。)nullnull
  • 对输入类型不太挑剔,因为所有输入都被强制为text.
  • 允许使用最短语法连接多个字符串。
  • 仅具有函数波动性STABLE(因为它采用"any"输入类型并将输入强制为文本,并且其中一些转换取决于区域设置或与时间相关的设置)。所以不适合需要不可变波动性的地方。看:

concat_ws()(“带分隔符”)...

  • 使用分隔符连接字符串时允许使用最短语法。
  • 只为非空字符串插入分隔符,从而大大简化了特定(常见)情况。
  • 否则就像concat().

format()...

  • 连接变量和常量时允许使用可读的短代码。
  • 提供格式说明符来安全、方便地引用字符串和标识符(以防止 SQL 注入和语法错误),使其成为动态 SQL 的首选。(你提到了触发器函数,其中使用了大量动态SQL。)
  • 是最复杂的工具。您可以多次重复使用相同的输入(使用不同的格式说明符使用不同的引用)。
  • null如果任何输入参数为 ,也不会返回null。(可能合意,也可能不合意。)
  • 也只有波动性STABLE

进一步阅读: