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 - 连接全名,只有在姓氏存在时才有空格的主要内容,如果未能解决你的问题,请参考以下文章