对于类似字符串类型的列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类型?