在没有重复代码的情况下跨多个列搜索多个值?

Searching for multiple values across multiple columns without repetitive code?

考虑简单的 WHERE 子句:

WHERE HomeZipCode = 12345

很简单吧?但是,如果您想查找多个邮政编码怎么办?

WHERE HomeZipCode IN (12345, 34567, 56789)

我喜欢 IN 运算符。

今天我了解到您可以在概念上反转 IN 语句以在多个列中搜索特定值:

WHERE 12345 IN (HomeZipCode, OfficeZipCode) 

这对我很有用,但是,作为我,我想要更多。我可以为第三个示例指定多个值吗?

WHERE !?{12345,34567,56789}?! IN (HomeZipCode, OfficeZipCode)

到目前为止,我还没有发现任何可以在不重复 VALUE IN (COL_LIST) 语法的情况下指定这些多个值的方法。

WHERE 
(12345 IN (HomeZipCode, OfficeZipCode)) OR 
(34567 IN (HomeZipCode, OfficeZipCode)) OR 
(56789 IN (HomeZipCode, OfficeZipCode))

WHERE
(HomeZipCode IN (12345, 34567, 56789)) OR
(OfficeZipCode IN (12345, 34567, 56789))

理想情况下,我希望只指定一次列或值列表,以便在代码中将列表维护在一个位置。

我将在此处使用拆分函数(您可以从许多 google 来源中获取其中一个的代码)将以逗号分隔的邮政编码列表拆分为派生的 table,然后在

加入它
  HomeZipCode = value
OR OfficeZipCode = value

或者只是

 value IN (HomeZipCode, OfficeZipCode)

您可以使用 table 值构造函数来指定多个值并将其与 IN 运算符一起使用

SELECT *
FROM table_name
OUTER APPLY (VALUES (12345), (34567), (56789)) AS [set](zip)
WHERE [set].zip IN (HomeZipCode, OfficeZipCode)

具有多个 UNION 而不是 VALUES

的变体
SELECT *
FROM table_name
OUTER APPLY (
    SELECT '12345'
    UNION ALL
    SELECT '34567'
    UNION ALL
    SELECT '56789') AS [set](zip)
WHERE [set].zip IN (HomeZipCode, OfficeZipCode)