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

时间:2015-01-05 20:44:42

标签: sql-server tsql

考虑简单的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))

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

2 个答案:

答案 0 :(得分:1)

您可以使用表值构造函数指定多个值,并将其与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)

答案 1 :(得分:0)

这是我将使用拆分功能(您可以从许多google-able源获取代码的代码)将逗号分隔的邮政编码列表拆分为派生表,然后加入

  HomeZipCode = value
OR OfficeZipCode = value

或者只是在

 value IN (HomeZipCode, OfficeZipCode)