如何在Postgres SELECT中连接列?

Ale*_*lex 133 sql postgresql types concatenation coalesce

我有两个字符串列ab一个表foo.

select a, b from foo返回值ab.但是,串联ab不起作用.我试过了 :

select a || b from foo
Run Code Online (Sandbox Code Playgroud)

select  a||', '||b from foo
Run Code Online (Sandbox Code Playgroud)

从评论更新:两列都是类型character(2).

Erw*_*ter 235

对于字符串类型character(2)(如稍后所述),显示的串联正常工作,因为引用手册:

[...]字符串连接operator(||)接受非字符串输入,只要至少有一个输入是字符串类型,如表9.8所示 .对于其他情况,插入明确的强制text[...]

大胆强调我的.第二个示例(select a||', '||b from foo)适用于任何数据类型,因为无类型字符串文字', '默认为类型,text使得整个表达式在任何情况下都有效.

对于非字符串数据类型,您可以通过强制转换至少一个参数来"修复"第一个语句text.(任何类型都可以转换为text):

SELECT a::text || b AS ab FROM foo;
Run Code Online (Sandbox Code Playgroud)

你自己的答案来看," 不起作用 "应该是指" 返回NULL ".任何连接到NULL 的结果都是NULL.如果可以涉及NULL值且结果不为NULL,则使用concat_ws()连接任意数量的值(Postgres 9.1或更高版本):

SELECT concat_ws(', ', a, b) AS ab FROM foo;
Run Code Online (Sandbox Code Playgroud)

或者,concat()如果您不需要分隔符:

SELECT concat(a, b) AS ab FROM foo;
Run Code Online (Sandbox Code Playgroud)

这里不需要类型转换,因为这两个函数都接受"any"输入并使用文本表示.

COALESCE在这个相关答案中有更多细节(以及为什么是一个糟糕的替代品):

关于评论中的更新

+在Postgres(或SQL标准)中不是字符串连接的有效运算符.微软的私人想法是将其添加到他们的产品中.

几乎没有任何理由可以使用character(n)(同义词:) char(n).使用textvarchar.细节:


Ale*_*lex 29

问题在于值中的空值; 然后连接不适用于空值.解决方案如下:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
Run Code Online (Sandbox Code Playgroud)


小智 17

最好在PostgreSQL中使用CONCAT函数进行连接

例如: select CONCAT(first_name,last_name) from person where pid = 136

如果你使用column_a || ''|| column_b用于连接2列,如果column_a或column_b中的任何值为null,则查询将返回null值.在所有情况下都可能不是首选..所以不要这样做

||

使用

CONCAT

如果它们中的任何一个有价值,它将返回相关值

  • 为我工作。高兴地发现我也可以在之间添加一个空格:`CONCAT(first_name, ' ', last_name)` (2认同)

Ram*_*are 6

CONCAT函数有时不适用于旧版本的postgreSQL

看看我不使用CONCAT来解决问题的方法

 u.first_name || ' ' || u.last_name as user,
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用

 "first_name" || ' ' || "last_name" as user,
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我对first_name和last_name使用双引号

希望这会有用,谢谢


Rak*_*din 5

因为我也被困在这个问题上,所以我想我应该分享最适合我的解决方案。我也认为这要简单得多。

如果您使用大写的表名。

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"
Run Code Online (Sandbox Code Playgroud)

如果使用小写表名

SELECT CONCAT(firstName, ' ', lastName) FROM user
Run Code Online (Sandbox Code Playgroud)

就是这样!。由于 PGSQL 计算列声明的双引号和字符串的单引号,这就像一个魅力。