我正在尝试执行CASE
语句,该语句组合了两个不相似的列。但是,这两列是名称,名称实际上可能相同,但有时可能包含后缀。例如,我想带回以下内容:
LastName1 | LastName2
------------------------
Ross | Ross, Jr.
Lee | Lee
Smith | Collins
Martin | Martin
Pierce, Sr. | Pierce
所以,我的陈述如下:
SELECT CASE WHEN LastName1 <> LastName2 THEN LastName1 + ', ' + LastName2 ELSE LastName1 END AS LastName
这将返回结果:
LastName
---------
Ross, Ross, Jr.
Lee
Smith, Collins
Martin
Pierce, Pierce, Sr.
但是我想使用NOT LIKE
(或类似的东西),如果LastName1
列的前几个字符与LastName2
类似,则只返回一个名称。所以我的结果集看起来像:
LastName
---------
Ross
Lee
Smith, Collins
Martin
Pierce
答案 0 :(得分:2)
您可以使用left来获取第一个 n 字符。这是非常干净的LEFT(col, n )
SELECT
CASE
WHEN left(LastName1,4) <> left(LastName2,4)
THEN LastName1 + ', ' + LastName2
ELSE LastName1 END AS LastName
但是这很容易出现误报,对你的数据集以及你选择的字符数量很敏感。在您的示例中,您有,,它会从后缀中断数据。如果这是一致的,您可以选择,之前的所有文字。 Here is an example
答案 1 :(得分:2)
我会使用like
比较来扩展您的比较:
SELECT (CASE WHEN LastName1 like LastName2 + '%' THEN LastName1
WHEN LastName2 like LastName1 + '%' THEN LastName2
ELSE LastName1 + ', ' + LastName2
END) AS LastName
答案 2 :(得分:0)
您可以使用CHARINDEX
来确定其中一个LastNames是否包含另一个。例如如果它们相似,你似乎想要姓氏的“出租人”:
SELECT
CASE
WHEN CHARINDEX(LastName1, LastName2 ) > 0
THEN LastName1
WHEN CHARINDEX(LastName2, LastName1 ) > 0
THEN LastName2
ELSE
LastName1 + ', ' + LastName2
END AS LastName
如果客户有双重名称,这显然会适得其反。 Fred James Jameson
只会Fred James
(或Jameson
)。
答案 3 :(得分:0)
以下修改是否有效?
SELECT
CASE
WHEN LastName1 <> SUBSTRING(LastName2, 1, LEN(LastName1)) THEN LastName1 + ', ' + LastName2
ELSE LastName1
END AS LastName
答案 4 :(得分:0)
不确定这是否是你想要的,但是如何:
Select case
When charIndex(lastName1, LastName2) <> 0 then lastName2
When charIndex(lastName2, LastName1) <> 0 then lastName1
Else lastName1 + lastName2 End
答案 5 :(得分:0)
您可以使用SUBSTRING或LEFT
在SUBSTRING时选择案例(LastName1,1,4)&lt;&gt; SUBSTRING(LastName2,1,4)那么LastName1 +','+ LastName2 ELSE LastName1 END AS LastName