如何在Postgres SELECT中连接列?

时间:2013-11-13 00:24:37

标签: sql postgresql types concatenation coalesce

我在表a中有两个字符串列bfoo

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

select a || b from foo

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

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

8 个答案:

答案 0 :(得分:211)

使用character(2)之类的string type列(如后所述),显示的连接正常,因为quoting the manual:

  

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

插入明确的强制

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

对于非字符串数据类型,您可以通过casting将第一个语句“修复”至少text的一个参数。 (任何类型都可以转换为text):

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

your own answer判断,“不起作用”应该是指“返回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是一个不好的替代品):

关于comment

中的更新

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

几乎没有任何理由使用 character(n) (同义词: char(n) )。使用text or varchar。详细说明:

答案 1 :(得分:23)

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

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

答案 2 :(得分:16)

最好在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

如果它们中的任何一个具有值

,它将返回相关值

答案 3 :(得分:4)

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

看看我用来解决问题而不使用CONCAT

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

或者您也可以使用

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

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

希望这会有用,谢谢

答案 4 :(得分:4)

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

如果使用大写表名。

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

如果使用小写的表名

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

就是这样!由于PGSQL将双引号视为列声明,将单引号视为字符串,所以这就像一种魅力。

答案 5 :(得分:0)

试试这个

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

答案 6 :(得分:0)

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

  

使用|| symbol或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);

这很有用!!!

答案 7 :(得分:-3)

例如,如果员工表由列组成:

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;