如何在 Postgres SELECT 中连接列?

问题描述 投票:0回答:9

我的表中有两个字符串列

a
b
foo

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

select a || b from foo

select  a||', '||b from foo

评论更新:两列都是类型

character(2)

sql postgresql types concatenation coalesce
9个回答
351
投票

使用字符串类型(包括

character(2)
),显示的连接就可以工作,因为,引用手册:

[...] 字符串连接运算符 (

||
) 接受非字符串 输入,只要至少有一个输入是字符串类型,如图 表 9.8。对于其他情况,请向
text
[...]

插入显式强制转换

我的粗体强调。第二个示例

select  a||', '||b from foo
适用于 any 数据类型,因为无类型字符串文字
', '
默认为类型
text
使整个表达式有效。

对于非字符串数据类型,您可以通过将至少一个参数text

强制转换
来“修复”第一个语句。 任何类型都可以转换为
text

SELECT a::text || b AS ab FROM foo;

你自己的答案来看,“不起作用”应该意味着“返回null”anything 连接到 null 的结果是 null。如果可以涉及

null
个值并且结果不能为空,则使用
concat_ws()
连接任意数量的值:

SELECT concat_ws(', ', a, b) AS ab FROM foo;

仅在非空值之间添加分隔符,即仅在必要时添加。

或者

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

SELECT concat(a, b) AS ab FROM foo;

不需要类型转换,因为这两个函数都接受

"any"
输入并使用文本表示。 但是,这也是为什么concat()
concat_ws()
函数波动性
都只是
STABLE
,而不是
IMMUTABLE
。如果您需要一个不可变函数(例如索引、生成列或分区),请参阅:

更多详细信息(以及为什么

COALESCE
是一个糟糕的替代品)在此相关答案中:

旁白

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

几乎没有任何充分的理由使用

character(n)
(同义词:
char(n)
)。使用
text
varchar
。详情:


49
投票

问题出在值的空值上;那么串联不适用于空值。解决办法如下:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;

31
投票

最好使用 PostgreSQL 中的 CONCAT 函数进行串联

例如:

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

如果您使用的是column_a || ' ' || column_b 用于连接 2 列,如果 column_a 或 column_b 中的任何一个值为 null 查询将返回 null 值。 这可能并非在所有情况下都是首选..所以而不是这个

||

使用

连接

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


14
投票

由于我也陷入了困境,我认为我应该分享最适合我的解决方案。我也觉得这个简单多了。

如果您使用大写的表名。

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"

如果使用小写表名

SELECT CONCAT(firstName, ' ', lastName) FROM user

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


12
投票

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

看看我在不使用 CONCAT 的情况下如何解决问题

 u.first_name || ' ' || u.last_name as user,

或者您也可以使用

 "first_name" || ' ' || "last_name" as user,

在第二种情况下,我对名字和姓氏使用双引号

希望这会有用,谢谢


0
投票

PHP 的 Laravel 框架, 我正在使用搜索名字、姓氏字段,就像全名搜索

使用 ||符号 或者 concat_ws(), concat() 方法

$names = str_replace(" ", "", $searchKey);                               
$customers = Customer::where('organization_id',$this->user->organization_id)
             ->where(function ($q) use ($searchKey, $names) {
                 $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); 
                 $q->orWhere('email', 'ilike', "%{$searchKey}%");
                 $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%');
    })->orderBy('created_at','desc')->paginate(20);

这很有魅力!


-1
投票

试试这个

select concat_ws(' ', FirstName, LastName) AS Name from person;

-2
投票

例如,如果有员工表,其中包含以下列:

employee_number,f_name,l_name,email_id,phone_number 

如果我们想将

f_name + l_name
连接为
name

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;

-2
投票

您也可以使用管道来执行此操作。

Select EmployeeID ,FirstName ||' ' || LastName as Full_Name from Employees
order by EmployeeID
© www.soinside.com 2019 - 2024. All rights reserved.