【问题标题】:SQL-Server CONCAT caseSQL-Server CONCAT 案例
【发布时间】:2015-11-17 15:32:59
【问题描述】:

我有以下练习:

连接名字,中间名,姓氏和名字后缀以形成 采用以下格式的客户姓名:FirstName [MiddleName.] 姓[,后缀]。请注意,应省略 NULL 值。

我将其解释为以下场景(根据图像创建表并插入一些值):

请在下面找到我的示例数据,名称是#TB_Customer CustomerName 列是预期结果,格式应为

  • FirstName MiddleName.LastName, Suffix 如果我有所有人的礼物 字段。
  • MiddleName 和 Suffix 可以是可选的,所以情况是:

  • 如果有suffix,但没有MiddleName,则CustomerName
    格式应为Firstname LastName,Suffix

  • 如果有MiddleName,但没有suffix,则CustomerName
    格式应为FirstName MiddleName.LastName

  • 如果MiddleNameSuffix 都为空,那么CustomerName 应该 格式为FirstName LastName)

这就是我得到的:

但正如您所见,我编写的 CustomerName 案例查询没有按预期工作(请参阅上面的 cases 和项目符号)

我为获取CustomerName 列而编写的查询是:

SELECT 
(case
when (MiddleName is not null and Suffix is not null)  then
CONCAT(c.FIRSTNAME,' ', c.MiddleName,'.', c.LASTNAME, ', ',Suffix)  
when (MiddleName is null and suffix is null) then 
CONCAT(c.FIRSTNAME,' ' ,c.LASTNAME) 
when (MiddleName is null and Suffix is not null )then
concat (c.FirstName, ' ', c.LastName, ', ',Suffix )  
when (Suffix is null and MiddleName is not null) then
concat (c.FirstName, ' ',MiddleName,'.',LastName)
end 
)AS CustomerName
,c.*
FROM   #TB_Customer c;

我有两个问题:

  • 我是否理解了这个练习,我的逻辑是否合理?
  • 我在哪里做错了,正确的查询是什么?

使用 SQL-Server 2012

编辑

要重新创建我的场景,请参阅下面的代码(抱歉没有链接小提琴,但网站在我当前位置没有响应)

CREATE TABLE #TB_Customer
(
CustomerID int , --PK
Title varchar(50),
FirstName varchar(50),
MiddleName varchar(50),
LastName varchar(50),
Suffix varchar(50),
EmailAddress varchar(50),
Phone varchar(50),
Gender varchar(50),
Birthdate varchar(50),
--no fk
PRIMARY KEY (CustomerID)
)

insert into #TB_Customer values
('1','Sir','John','Jacob','Adams','St','johnJacobAdams@gmail.com','0677731235','M','1989-04-06'),
('2','Mr.','Russel','Thyrone','Peterson','pr','thyronePeterson@yahoo.com','555-010405','M','1963-02-01'),
('3','Ms.','Anne','Candice','Acola','aca','CandiceA@gmail.com','07408989989','F','1988-05-19'),
('4','Mrs.','Sophia','Veronika','Turner','tvs','SophiaVT@facebook.de','0423423887','F','1983-06-20'),
('5','Ms','Margaret','','Delafleur','','delaMarg@yahoo.co','233223355','Female','1982-02-25'),
('6','Mrs','Jessica','Luana','Cruz','','Jess@yahoo.com','787876631','Female','1922-05-05'),
('7','Mr','Dyrius','','Cruz','dc','dyr33@yahoo.com','0673332211','Male','1987-03-01')

update #TB_Customer
set Gender = 'Male' where Gender = 'M'
update #TB_Customer
set Gender = 'Female' where Gender = 'F'

【问题讨论】:

  • @DanBracuk 请参见预期结果中的第 5 行。那不行。还有第 7 行
  • 当您没有显示结果时,我们应该如何看到您的查询不起作用?此外,您列出了三种情况,而您的代码有四种,而且顺序相当奇怪。
  • 所以你的“预期结果”实际上并不是你所期望的,而是你实际得到的?
  • @Henrik 有4种情况,第一种是每个字段都是not null的场景。该列的预期值在项目符号列表中。将编辑并用项目符号放置第 4 个案例
  • 您是否意识到您正在检查 NULL 但样本数据中的任何地方都没有一个 NULL?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

这样的东西应该也可以...

SELECT concat(firstname
     ,CASE WHEN ISNULL(middlename,'') <> '' THEN ' '+middlename+'.'
        WHEN ISNULL(middlename,'') <> '' AND ISNULL(suffix,'') = '' THEN '.' 
        ELSE ' ' END
     ,lastname
     ,CASE WHEN ISNULL(suffix,'') <> '' THEN ', '+suffix END)
FROM #TB_Customer

输出:

John Jacob.Adams, St
Russel Thyrone.Peterson, pr
Anne Candice.Acola, aca
Sophia Veronika.Turner, tvs
Margaret Delafleur
Jessica Luana.Cruz
Dyrius Cruz, dc
John Adams, St

【讨论】:

  • 标记为提供不使用 coalesce 的有效解决方案的答案(仅尝试使用案例,谢谢)
  • @Doolius WHEN ISNULL(middlename,'') &lt;&gt; '' AND ISNULL(suffix,'') = '' THEN '.',这个条件会被评估吗?我问这个是因为如果 middlenameNOT NULL 那么第一个 WHEN 条件将始终执行。
【解决方案2】:

我在你的查询中看不到错误,我知道如果其中一列是空的,其他的都是空的,但是试试这个方法:

SELECT COALESCE(c.FIRSTNAME,'') + ' ' +
        CASE WHEN COALESCE(c.MiddleName,'') = ''
                THEN ''
                ELSE c.MiddleName + '.'
            END
        + COALESCE(c.LASTNAME,'') +
        CASE WHEN COALESCE(Suffix,'') = ''
                THEN ''
                ELSE  ', ' + Suffix
             END AS CustomerName, c.*

FROM   #TB_Customer c;

@Henrik 是对的,'' 和 NULL 是不同的东西

【讨论】:

  • 这给出了第 5 行(请参见第二张图片)。 Margaret .Delafleur, 应该给 Margaret Delafleur ,不带点或逗号
  • 已编辑,但图片在 Delafleur 之前显示了一个点
  • 这很好用,谢谢。接受 Doolius 的回答,因为它不使用合并,只寻找案例(但很好的解决方案,我赞成)
【解决方案3】:

现在您已经给出了代码,我可以看到错误是什么:空字符串与 NULL 不同。

因此,您对中间名/后缀是否存在的测试将始终为真。

要么将这些字段设置为 NULL,要么增加测试以检查 NULL 或空字符串。

【讨论】:

  • 感谢您的回答,我不知道如何“检查 NULL 或空字符串”。想法?
  • 您使用“field IS NULL”检查 NULL,使用“field = ''”检查空字符串,然后将它们与 AND 或 OR(可能还有一些括号)结合起来,就像您已经拥有的一样。
  • 这样试了,不行:SELECT (case when (MiddleName is not null and Suffix is not null) then CONCAT(c.FIRSTNAME,' ', c.MiddleName,'.', c.LASTNAME, ', ',Suffix) when (MiddleName is null or MiddleName = '') and (suffix is null or suffix = '') then CONCAT(c.FIRSTNAME,' ' ,c.LASTNAME) when (MiddleName is null or MiddleName = '' ) and (Suffix is not null )then concat (c.FirstName, ' ', c.LastName, ', ',Suffix ) when (Suffix is null or Suffix = '')and MiddleName is not null then concat (c.FirstName, ' ',MiddleName,'.',LastName) end )AS CustomerName ,c.* FROM #TB_Customer c;
  • 抱歉弄乱了,但小提琴在这里对我不起作用。我明白你的意思了吗?
  • 这真的很难阅读,但我认为这行不通。据我所见,如果 MiddleName 和 Suffix 都是 '' 你会遇到第一种情况 - 但是你添加了一个空字符串检查,它看起来是正确的。
【解决方案4】:
SELECT
    STUFF(RTRIM(
        CONCAT('  ',
            COALESCE(NULLIF(FirstName,'') + ' ', ''),
            COALESCE(NULLIF(MiddleName,'') + '.', ''),
            COALESCE(NULLIF(LastName,''), ''),
            COALESCE(', ' + NULLIF(Suffix,'') , '')
        )
    ), 2, 0,'')
FROM #TB_Customer tc

出于某种奇怪的原因添加了STUFF,你所拥有的只是一个后缀

【讨论】:

  • 这很好用,谢谢。接受 Doolius 的回答,因为它不使用合并,只寻找案例(但很好的解决方案,我赞成)
  • @CM2K 谢谢..您可能还想看看这个..如果您正在创建某种名称标签,它会以您实际希望看到的方式形成名称..@987654321 @ 只使用中间名的句号等
猜你喜欢
  • 1970-01-01
  • 2012-04-28
  • 2013-10-14
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多