对于类似字符串类型的列character(2)
(如您稍后所述),显示的连接仅能起作用,因为引用了该手册:
字符串连接运算符(||
)接受非字符串输入,只要至少一个输入为字符串类型即可,如表9.8所示
。对于其他情况,请在text
[...]上插入显式强制
大胆强调我的。第二个示例(select a||', '||b from foo
)适用于任何数据类型,因为未类型化的字符串文字', '
默认为text
在任何情况下都使整个表达式有效的类型。
对于非字符串数据类型,您可以通过强制转换来“修复”第一条语句至少一个参数为text
。(可以将任何类型强制转换为text
):
SELECT a::text || b AS ab FROM foo;
从您自己的答案来看,“ 不起作用 ”应该表示“ 返回NULL ”。任何串联为NULL 的结果都是NULL。如果可以包含NULL值并且结果不得为NULL,请使用concat_ws()
串联任意数量的值(Postgres 9.1或更高版本):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
或者,concat()
如果您不需要分隔符:
SELECT concat(a, b) AS ab FROM foo;
由于两个函数都接受"any"
输入并使用文本表示,因此这里不需要类型转换。
COALESCE
在此相关答案中有更多详细信息(以及为什么不能替代):
+
在Postgres(或标准SQL)中不是有效的字符串连接运算符。将其添加到他们的产品是Microsoft的一个私人想法。
几乎没有任何理由使用character(n)
(同义词:)char(n)
。使用text
或varchar
。细节:
text
类型?