SQL - 连接全名,只有在姓氏存在时才有空格

Posted

技术标签:

【中文标题】SQL - 连接全名,只有在姓氏存在时才有空格【英文标题】:SQL - Concat full name, and a space only if last name is present 【发布时间】:2016-11-10 03:48:30 【问题描述】:

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

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

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

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

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

【问题讨论】:

你不能用case语句代替吗? (我不知道您的其余问题):case when customers.lastname is null then customers.firstname else concat(customers.firstname, ' ', customers.lastname) end 这正是我所需要的。谢谢!也找到了文档:postgresql.org/docs/7.4/static/functions-conditional.html. 不客气;您应该将此作为已接受的答案发布 - 制作一个新答案并接受它。 @daf 简单一点:concat(customers.firstname, ' ' || nullif(customers.lastname, '')) 很公平——请注意这是 postgre 特有的语法。我知道这个问题是针对 postgre 的,但我个人尽量避免像瘟疫这样的特定于引擎的语法。 【参考方案1】:

您可以使用TRIM() function 调用去除任何前导或尾随空格:

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

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

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

【讨论】:

这不会修剪“哈利波特”的尾随空格吗? 是的,它会,如果你只有“Harry”,它应该完成同样的事情,因为你的CONCAT() 会导致它成为“Harry”,然后修剪会处理剩下的事情.【参考方案2】:

我用这个:

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

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

【讨论】:

【参考方案3】:

这对我有用:

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。

【讨论】:

【参考方案4】:

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

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;

【讨论】:

以上是关于SQL - 连接全名,只有在姓氏存在时才有空格的主要内容,如果未能解决你的问题,请参考以下文章

Hive表连接

在 PL/SQL 中连接名字和姓氏的函数

如何将参数作为字符串连接,中间有空格? [复制]

如何在 MATLAB 中连接元胞数组中的字符串,它们之间有空格?

使用连接创建存储过程?

PLSQL ORA-12154: TNS: 无法解析指定的连接标识符