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_SPLIT
和 NOT EXISTS
:
SELECT ID
FROM dbo.YourTable YT
WHERE NOT EXISTS (SELECT 1
FROM STRING_SPLIT(YT.sys2lname,'-') SS
WHERE SS.[value] = YT.sys1lname);
这是一些示例数据
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_SPLIT
和 NOT EXISTS
:
SELECT ID
FROM dbo.YourTable YT
WHERE NOT EXISTS (SELECT 1
FROM STRING_SPLIT(YT.sys2lname,'-') SS
WHERE SS.[value] = YT.sys1lname);