我有以下练习:
将名字的第一部分、中间部分、姓和后缀连接起来,以以下格式形成客户名称:FirstName [MiddleName.] LastName[, Suffix]。请注意,应省略NULL值。
我理解这个问题的场景如下(从图像创建表并插入了一些值):
请查看我的示例数据,名称为#TB_Customer
CustomerName列是期望的结果,应该为以下格式
FirstName MiddleName.LastName, Suffix
如果我有所有字段的输入。- 中间名和后缀可以选择性地省略,所以情况如下:
- 如果存在
suffix
但不存在MiddleName
,则CustomerName
应该是Firstname LastName,Suffix
的形式。 - 如果存在
MiddleName
但不存在suffix
,则CustomerName
应该是FirstName MiddleName.LastName
的形式。 - 如果
MiddleName
和Suffix
都为空,则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
编辑
为了重新创建我的场景,请参见下面的代码(很抱歉没有链接到fiddle,但该网站在我当前位置无法响应)
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'