我在表foo中有两个字符串列a和b。
foo
a
b
select a, b from foo返回值a和b。然而,a和b的串联是无效的。我试着:
select a, b from foo
select a || b from foo
而且
select a||', '||b from foo
从注释更新:两列都是character(2)类型。
character(2)
对于像character(2)这样的字符串类型列(正如你后面提到的),显示的连接只是有效的,因为,引用手册:
< p >[…字符串连接运算符(||)接受非字符串 输入,只要至少有一个输入为字符串类型,如 表9.8。对于其他情况,插入一个显式强制text[…]
||
text
大胆强调我的。第二个例子(select a||', '||b from foo)适用于任何数据类型,因为无类型字符串字面量', '默认为类型text,使得整个表达式在任何情况下都有效。
', '
对于非字符串数据类型,可以“fix"铸造的第一个语句至少有一个text的参数。(任何类型可以转换为text):
SELECT a::text || b AS ab FROM foo;
从你自己的答案判断,"不起作用"应该是指“__abc3”。任何东西连接到NULL的结果是NULL。如果可以包含零值,且结果不应为NULL,则使用< >强concat_ws() < / >强来连接任意数量的值(Postgres 9.1或更高版本):
concat_ws()
SELECT concat_ws(', ', a, b) AS ab FROM foo;
分隔符仅在非空值之间添加,即仅在必要时添加。
如果不需要分隔符,则使用concat():
concat()
SELECT concat(a, b) AS ab FROM foo;
这里不需要类型强制转换,因为两个函数都接受"any"输入并使用文本表示。
"any"
更多细节(以及为什么COALESCE是一个糟糕的替代品)在这个相关的答案中:
COALESCE
+不是Postgres(或标准SQL)中字符串连接的有效操作符。在他们的产品中添加这个功能是微软的私人想法。
+
几乎没有任何好的理由使用character(n)(同义词:char(n))。使用__ABC2或varchar。细节:
character(n)
char(n)
varchar
问题在于值中的空值;那么,连接对null无效。解决方法如下:
SELECT 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中的任何值为null,则查询将返回空值。 这可能不是在所有情况下都可取。所以不是
使用
CONCAT
如果它们中的任何一个有值,它将返回相关的值
CONCAT函数有时不适用于较旧的postgreSQL版本
看看我不使用CONCAT是如何解决问题的
u.first_name || ' ' || u.last_name as user,
或者你也可以用
"first_name" || ' ' || "last_name" as user,
在第二种情况下,我使用双引号first_name和last_name
希望这对你有用,谢谢
试试这个
select concat_ws(' ', FirstName, LastName) AS Name from person;
例如,如果有一个员工表,它由如下列组成:
employee_number,f_name,l_name,email_id,phone_number
如果我们想将f_name + l_name连接为name。
f_name + l_name
name
SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;
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("firstName", ' ', "lastName") FROM "User"
如果使用小写表名
SELECT CONCAT(firstName, ' ', lastName) FROM user
就是这样!PGSQL在列声明中使用双引号,在字符串中使用单引号,这就像一个魅力。