我在表foo
中有两个字符串列a
和b
。
select a, b from foo
返回a
和b
的值。然而,a
和b
的连接并不起作用。我尝试了:
select a || b from foo
和
select a||', '||b from foo
评论更新:两列都是类型character(2)
。
我在表foo
中有两个字符串列a
和b
。
select a, b from foo
返回a
和b
的值。然而,a
和b
的连接并不起作用。我尝试了:
select a || b from foo
和
select a||', '||b from foo
评论更新:两列都是类型character(2)
。
对于像您稍后提到的character(2)
这样的字符串类型列,显示连接仅起作用是因为根据手册所述:
[...] 字符串连接运算符(
||
)接受非字符串输入,只要至少有一个输入是字符串类型,如表9.8所示。对于其他情况,请插入显式强制转换为text
[...]
这里强调是我的。第二个示例(select a||', '||b from foo
)对于任何数据类型都有效,因为未经过类型定义的字符串文字', '
默认为类型text
,使整个表达式在任何情况下都有效。
对于非字符串数据类型,您可以通过将至少一个参数转换为text
来“修复”第一个语句。(任何类型都可以强制转换为text
):
SELECT a::text || b AS ab FROM foo;
从你自己的回答来看,"does not work"的意思应该是"返回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)中用于字符串连接的有效运算符。这是微软将其添加到其产品的私有想法。
几乎没有什么好理由使用(同义词:character(n)
)。使用char(n)
text
或varchar
。详情如下:
Postgres 9.1 或更高版本
,对吧? 你一开始就应该在问题中提供你的Postgres版本。 请在回来提问之前更新你的问题,包括所有请求的信息。 - Erwin Brandstettera
和b
是VARCHAR
类型时,SELECT concat(a, b) FROM foo;
在Postgres 9.3中对我有效。 - elimisteveSELECT coalesce(a, '') || coalesce(b, '') FROM foo;
在PostgreSQL中,最好使用CONCAT函数进行字符串拼接。
例如:select CONCAT(first_name,last_name) from person where pid = 136
如果您使用column_a || ' ' || column_b来连接2列,如果column_a或column_b的值为空,则查询将返回空值。这可能不是所有情况下都希望发生的。所以,可以用CONCAT替代||符号。
||
改为使用
CONCAT
如果它们中有任何一个具有值,则会返回相关值。
CONCAT(first_name,' ',last_name)
。 - Neil Gaetano Lindberg我也陷入了同样的困境,我觉得我应该分享对我最有效的解决方案。我也认为这更简单。
如果您使用大写表名。
SELECT CONCAT("firstName", ' ', "lastName") FROM "User"
如果您使用小写表名
SELECT CONCAT(firstName, ' ', lastName) FROM user
就是这样!由于PGSQL在列声明中计算双引号,而在字符串中计算单引号,因此这非常顺利。
concat_ws()
。 - Erwin Brandstetter在较旧版本的postgreSQL中,CONCAT函数有时无法正常工作。
看看我用来解决问题而不使用CONCAT的方法
u.first_name || ' ' || u.last_name as user,
或者你也可以使用
"first_name" || ' ' || "last_name" as user,
在第二种情况下,我在 first_name 和 last_name 上使用了双引号。PHP的Laravel框架, 我正在使用搜索first_name、last_name字段,考虑像全名搜索一样
使用||符号或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);
这个完美运行了!!!
试试这个
select concat_ws(' ', FirstName, LastName) AS Name from person;
concat_ws(' ', FirstName, LastName)
更清晰简洁。 - user330315employee_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;
你也可以使用管道进行此操作。
Select EmployeeID ,FirstName ||' ' || LastName as Full_Name from Employees
order by EmployeeID
text
类型? - PM 77-1