CASE语句组合两列,除非第一个字符不相似

时间:2014-05-02 18:14:33

标签: sql tsql

我正在尝试执行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

6 个答案:

答案 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