SQL WHERE条件,一个字段的字符串可以在另一个字段中找到

SQL WHERE condition that one field's string can be found in another field

这是一些示例数据

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

目标是查找姓氏不匹配的记录,但允许在 sys2lname 中的某处找到 sys1lname,这可能是也可能不是带连字符的名称。所以从上面的数据来看,只有记录4应该return.

当我将此 (SUBSTRING(sys2lname, CHARINDEX(sys2lname, ccm.NAME_LAST), LEN(sys1lname))) 放入 SELECT 语句中时,它将正确 return 与 sys1lname 匹配的 sys2lname 部分。

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

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

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

我也想不通为什么。

只需使用 NOT LIKE:

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

如果您可以在 sys1lname 中使用 'Smith'sys2lname 中的 'BlackSmith'(甚至 'Green-Blacksmith')这样的名称并且不想要它们为了匹配,我会使用 STRING_SPLITNOT EXISTS:

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