2015-01-05 3 views
2

Рассмотрим простой предложения 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)) 

В идеале я хотел бы иметь столбец или список значений, указанный только один раз, так что список хранится в одном месте в коде.

+1

(+1) Я не знал о возможности обратного 'оператор в' - это действительно полезная функция! спасибо за обмен –

ответ

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) 
+0

Наконец-то обдумал это, и это похоже на идеальное решение. Оба (на данный момент) решения являются работоспособными, но для удобства понимания кода мне нравится это лучше. Можно ли заполнить предложение VALUES результатами запроса? –

+0

Вам не нужно заполнять предложение VALUES' результатами запроса. Вы можете просто заменить предложение VALUES на запрос. (btw, значение table constrictor является просто синтаксическим сахаром для нескольких UNION-заявлений) –

0

Здесь я бы использовал функцию разделения (вы можете захватить код для одного из многих источников, доступных в Google), чтобы разбить список почтовых индексов, разделенных запятыми, на производную таблицу, а затем присоединиться к ней на

HomeZipCode = value 
OR OfficeZipCode = value 

Или просто на

value IN (HomeZipCode, OfficeZipCode) 
+0

Я не уверен, что работает. Я попытался создать таблицу (например, [AllowedValues]), и у нее был один столбец [ZipCode]. До тех пор, как таблица была одно значение, это сработало: WHERE (SELECT ZipCode FROM ALLOWEDVALUES) в (HomeZipCode, WorkZipCode) , но как только я добавил второе значение, я получил «суб-выбрать возвращается более чем одно значение ". –

+0

Да, поэтому вам нужно ПРИСОЕДИНИТЬСЯ к производной таблице, а не использовать подвыбор. Или вы могли бы использовать WHERE EXISTS (subselect ...) –

Смежные вопросы