SQL - 仅当姓氏存在时才连接全名和空格

问题描述 投票:0回答:5

我目前正在像这样连接名字和姓氏(使用 PostgreSQL):

concat(customers.firstname, ' ', customers.lastname)

我遇到的问题是,我的客户只输入了名字(即“罗纳尔多”)。上面的查询将返回“Ronaldo”,但不会匹配。

我可以使用我的服务器端语言来检查尾随空格,但是如果我的数据库中的某处有客户不小心输入了尾随空格(即“哈利·波特”),那么我将不会匹配该空格也有一个。

我正在寻找将返回“Ronaldo”、“John Smith”和“Harry Potter”的 SQL。所以基本上,如果姓氏不等于“”(空字符串),我想在名字和姓氏之间包含一个空格。如果姓氏是“”(空字符串),那么我不希望名字后面有空格。只用 SQL 就可以做到这一点吗?或者我必须弄清楚如何使用服务器端语言适当地解析它?

sql postgresql concatenation
5个回答
14
投票

您可以使用

TRIM()
函数 调用来去除任何前导或尾随空格:

TRIM(CONCAT(customers.firstname, ' ', customers.lastname))

TRIM()
还允许您使用以下语法指定要删除的字符以及字符串中的位置(即开头、结尾、两者等):

TRIM([LEADING | TRAILING | BOTH] [characters] FROM YourColumnOrString)

3
投票

我用这个:

trim(both from COALESCE(firstname, '') || ' ' || COALESCE(lastname, '')

如果名字和姓氏都可以为空。


1
投票

这对我有用:

case
  when customers.lastname = ''
    then customers.firstname
  else
    concat(customers.firstname, ' ', customers.lastname)
end

案例文档:https://www.postgresql.org/docs/7.4/static/functions-conditional.html.

特别感谢daf


0
投票

试试这个... 这将删除所有(开始和结束)空格

SELECT RTRIM(CONCAT(LTRIM(RTRIM(First_Name)) , ' ' , LTRIM(RTRIM(Last_Name)))) 
AS 'Full_Name'
FROM tableName;

如果您还想插入中间名,您可以尝试这样的操作...

SELECT (RTRIM(LTRIM(RTRIM(First_Name)) + ' ' + LTRIM(RTRIM(Middle_Name))) + ' ' + LTRIM(RTRIM(Last_Name))) 
AS 'Full_Name'
FROM tableName;

0
投票

您可以使用

concat_ws
字符串函数来连接字符串(忽略NULL值),其中第一个参数是分隔符,其余参数是要连接的字符串。请参阅文档
示例:

SELECT
    concat_ws(' ', customers.firstname, NULLIF(customers.lastname, '')) AS fullname
FROM customers

此解决方案应给出以下结果(根据您的要求为 1-3)

  1. “约翰”和“史密斯”=>“约翰·史密斯”
  2. “罗纳尔多”和“”=>“罗纳尔多”
  3. “哈利”和“波特”=>“哈利·波特”
  4. “罗纳尔多”和 NULL =>“罗纳尔多”
© www.soinside.com 2019 - 2024. All rights reserved.