189

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

select a, b from foo返回值ab. 但是,aand的连接b不起作用。我试过了 :

select a || b from foo

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

评论更新:两列都是 type character(2)

4

8 回答 8

305

对于字符串类型的列character(2)(如您稍后提到的),显示的连接只是起作用,因为引用手册:

[...] 字符串连接运算符 ( ||) 接受非字符串输入,只要至少一个输入是字符串类型,如 表 9.8所示。对于其他情况,插入显式强制转换text[...]

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

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

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

您自己的回答来看,“不起作用”应该意味着“返回 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)中字符串连接的有效运算符。将其添加到他们的产品中是 Microsoft 的私人想法。

几乎没有任何好的理由使用character(n)(同义词:)char(n)。使用textvarchar。细节:

于 2013-11-13T01:09:44.193 回答
40

问题在于值中的空值;那么连接不适用于空值。解决方法如下:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
于 2013-11-13T16:12:49.917 回答
26

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

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

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

||

利用

康卡特

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

于 2014-06-09T09:36:14.393 回答
10

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

看看我过去在不使用 CONCAT 的情况下解决问题的方法

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

或者你也可以使用

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

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

希望这将是有用的,谢谢

于 2014-12-09T06:47:40.853 回答
6

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

如果您使用大写的表名。

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

如果使用小写表名

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

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

于 2020-02-05T07:03:13.917 回答
0

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);

这有效的魅力!

于 2018-06-25T08:17:47.217 回答
-2

尝试这个

select textcat(textcat(FirstName,' '),LastName) AS Name from person;
于 2015-11-13T10:14:43.287 回答
-2

例如,如果有一个包含以下列的员工表:

employee_number,f_name,l_name,email_id,phone_number 

如果我们想连接f_name + l_namename.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;
于 2017-04-28T04:59:56.290 回答