【问题标题】:SQL WHERE condition that one field's string can be found in another fieldSQL WHERE 条件是一个字段的字符串可以在另一个字段中找到
【发布时间】:2021-08-19 12:50:15
【问题描述】:

这是一些示例数据

    ID | sys1lname | sys2lname
------------------------------------
    1  | JOHNSON   | JOHNSON
    2  | FULTON    | ANDERS-FULTON
    3  | SMITH     | SMITH-DAVIDS
    4  | HARRISON  | JONES

目标是查找姓氏不匹配的记录,但允许在 sys2lname 中的某个位置找到 sys1lname 时,它​​可能是也可能不是连字符的名称。所以从上面的数据来看,只有记录 4 应该返回。

当我将这个(SUBSTRING(sys2lname, CHARINDEX(sys2lname, ccm.NAME_LAST), LEN(sys1lname))) 放在SELECT 语句中时,它将正确返回与sys1lname 匹配的sys2lname 部分。

但是当我在WHERE 子句中使用它时

WHERE 1=1
    AND sys1lname <> sys2lname
    OR sys1lname not in ('%' + (SUBSTRING(sys2lname, CHARINDEX(sys1lname, sys2lname), LEN(sys1lname))))

带有连字符名称的记录在结果集中。

我不知道为什么。

【问题讨论】:

    标签: tsql substring charindex


    【解决方案1】:

    只需使用NOT LIKE

    SELECT ID
    FROM dbo.YourTable
    WHERE sys2lname NOT LIKE '%' + sys1lname + '%';
    

    如果您可以在sys1lname 中使用'Smith''BlackSmith' 中的'BlackSmith'(甚至'Green-Blacksmith')这样的名称并且不希望它们匹配,我会使用STRING_SPLIT 和@ 987654329@:

    SELECT ID
    FROM dbo.YourTable YT
    WHERE NOT EXISTS (SELECT 1
                      FROM STRING_SPLIT(YT.sys2lname,'-') SS
                      WHERE SS.[value] = YT.sys1lname);
    

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多