【发布时间】:2022-11-10 01:56:59
【问题描述】:
设置:
下面是一段代码,它以一组不寻常的格式生成样本名称表。任务是将它们转换为标准格式。还列出每个名称的所需结果,因此请求不会混淆。
DROP TABLE IF EXISTS #temp;
CREATE TABLE #temp (Testname VARCHAR(20) null, Desiredresult VARCHAR(20) null);
INSERT INTO #temp(Testname, Desiredresult)
VALUES('ct last/firstn bc', 'Firstn Last');
INSERT INTO #temp(Testname, Desiredresult)
VALUES('ct lastn/first', 'First Lastn');
INSERT INTO #temp(Testname, Desiredresult)
VALUES('last/firstname bs', 'Firstname Last');
INSERT INTO #temp(Testname, Desiredresult)
VALUES('lastname/first', 'First Lastname');
INSERT INTO #temp(Testname, Desiredresult)
VALUES('First Last', 'First Last');
INSERT INTO #temp(Testname, Desiredresult)
VALUES('Firstname A Lastname', 'Firstname Lastname');
我能够生成适用于此的代码,但我毫不怀疑这不是最有效的方法。我很想知道完成这项任务的更好方法。下面是我为此编写的代码。
DROP TABLE IF EXISTS #test
SELECT *
,CASE
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) <> 0 THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname)-CHARINDEX('/',T.Testname)+1-CHARINDEX(' ',REVERSE(T.Testname))-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) = 0 THEN LEFT(T.Testname,CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) < CHARINDEX('/',T.TestName) THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname))
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) > CHARINDEX('/',T.TestName)THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,CHARINDEX(' ',T.Testname)-CHARINDEX('/',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) = 0 THEN LEFT(T.Testname,CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 0 THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname))
END AS FirstName
,CASE
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) <> 0 THEN SUBSTRING(T.Testname,CHARINDEX(' ',T.Testname)+1,CHARINDEX('/',T.Testname)-CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) = 0 THEN RIGHT(T.Testname,CHARINDEX(' ',REVERSE(T.Testname))-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) < CHARINDEX('/',T.TestName) THEN SUBSTRING(T.Testname,CHARINDEX(' ',T.Testname)+1,CHARINDEX('/',T.Testname)-CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) > CHARINDEX('/',T.TestName)THEN SUBSTRING(T.Testname,1,CHARINDEX('/',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) = 0 THEN RIGHT(T.Testname,CHARINDEX(' ',REVERSE(T.Testname))-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 0 THEN SUBSTRING(T.Testname,1,CHARINDEX('/',T.Testname)-1)
END AS LastName
,CASE
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) <> 0 THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname)-CHARINDEX('/',T.Testname)+1-CHARINDEX(' ',REVERSE(T.Testname))) + SUBSTRING(T.Testname,CHARINDEX(' ',T.Testname)+1,CHARINDEX('/',T.Testname)-CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 2 AND CHARINDEX('/',T.Testname) = 0 THEN LEFT(T.Testname,CHARINDEX(' ',T.Testname)-1) + RIGHT(T.Testname,CHARINDEX(' ',REVERSE(T.Testname)))
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) < CHARINDEX('/',T.TestName) THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname)) + ' ' + SUBSTRING(T.Testname,CHARINDEX(' ',T.Testname)+1,CHARINDEX('/',T.Testname)-CHARINDEX(' ',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) <> 0 AND CHARINDEX(' ',T.Testname) > CHARINDEX('/',T.TestName)THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,CHARINDEX(' ',T.Testname)-CHARINDEX('/',T.Testname)-1) + ' ' + SUBSTRING(T.Testname,1,CHARINDEX('/',T.Testname)-1)
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 1 AND CHARINDEX('/',T.Testname) = 0 THEN T.Testname
WHEN LEN(Testname)-LEN(REPLACE(Testname, ' ', '')) = 0 THEN SUBSTRING(T.Testname,CHARINDEX('/',T.Testname)+1,LEN(T.Testname)) + ' ' + SUBSTRING(T.Testname,1,CHARINDEX('/',T.Testname)-1)
END AS FullName
INTO #test
FROM #temp AS T
SELECT
T.Testname
,T.Desiredresult
,UPPER(LEFT(T.FirstName,1))+LOWER(RIGHT(T.FirstName,LEN(T.FirstName)-1))+' '+UPPER(LEFT(T.LastName,1))+LOWER(RIGHT(T.LastName,LEN(T.LastName)-1)) AS ProperName
FROM #test AS T
【问题讨论】:
-
严肃的问题:您将如何处理只有一个名字的人的记录? Falsehoods Programmers Believe About Names
-
@AlwaysLearning 这是一个很好的问题,我的代码没有解决这个问题,但问题中提供的数据集以及我实际正在处理的数据集都不是问题。为它写一个案例会很有趣,以便将来进行校对。
-
这里没有灵丹妙药。随着时间的推移,任何算法都必须被观察和调整。随着人口的增长,您会发现越来越多的惊喜。
-
@JohnCappelletti 我知道对于每一个可能发生的情况都不会有灵丹妙药。那不是我要求的。请求是针对这 6 个示例。就像没有能赢得国际象棋的灵丹妙药一样,国际象棋挑战无处不在。
标签: sql sql-server tsql sql-server-2016