我在表 foo
中有两个字符串列 a
和 b
。
select a, b from foo
返回值 a
和 b
。但是,a
和 b
的连接不起作用。我试过了:
select a || b from foo
和
select a||', '||b from foo
根据评论更新:两列都是 character(2)
类型。
最佳答案
与 string type像 character(2)
这样的列(正如您稍后提到的那样),显示的串联才有效,因为 quoting the manual:
[...] the string concatenation operator (
||
) accepts non-string input, so long as at least one input is of a string type, as shown in Table 9.8. For other cases, insert an explicit coercion totext
[...]
大胆强调我的。第二个示例(select a||', '||b from foo
)适用于任何数据类型,因为未类型化的字符串文字', '
默认输入 text
使整个表达式在任何情况下都有效。
对于非字符串数据类型,您可以通过 casting“修复”第一条语句text
的至少一个参数。 (任何类型都可以转换为text
):
SELECT a::text || b AS ab FROM foo;
从your own answer来看,“不起作用”应该意味着“返回 NULL”。 anything 连接到 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
是一个糟糕的替代品):
关于 comment 中的更新
+
不是 Postgres(或标准 SQL)中字符串连接的有效运算符。将此添加到他们的产品中是 Microsoft 的私有(private)想法。
几乎没有什么好的理由使用(同义词:character(n)
).使用 char(n)
text
or varchar
.详情:
关于sql - 如何连接 Postgres SELECT 中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942824/