在表foo中有两个字符串列a和b。

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

select a || b from foo

and

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

从注释更新:两列都是类型字符(2)。


当前回答

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

这招奏效了!!

其他回答

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

看看我不使用CONCAT是如何解决问题的

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

或者你也可以用

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

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

希望这对你有用,谢谢

例如,如果有一个员工表,它由如下列组成:

employee_number,f_name,l_name,email_id,phone_number 

如果我们想连接f_name + l_name作为名称。

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

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

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

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

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

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;

这里不需要类型强制转换,因为这两个函数都接受“任何”输入并使用文本表示。

更多细节(以及为什么COALESCE是一个糟糕的替代品)在这个相关的答案中:

合并两列并添加到一个新列中

关于评论中的更新

在Postgres(或标准SQL)中,+不是字符串连接的有效操作符。在他们的产品中添加这个功能是微软的私人想法。

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

使用数据类型“文本”存储字符串的任何缺点? 检查“空值或空值”的最佳方法

试试这个

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

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

这招奏效了!!