ВЫБЕРИТЕ ГДЕ ... сотни условий - PullRequest
3 голосов
/ 18 декабря 2008

Есть ли элегантный способ сделать это:

SELECT Cols from MyTable WHERE 
zip = 90210 OR
zip = 23310 OR
zip = 74245 OR
zip = 77427 OR
zip = 18817 OR
zip = 94566 OR
zip = 34533 OR
zip = 96322 OR
zip = 34566 OR
zip = 52214 OR
zip = 73455 OR
zip = 52675 OR
zip = 54724 OR
zip = 98566 OR
zip = 92344 OR
zip = 90432 OR
zip = 91532 OR
...

(почтовые индексы в этом сообщении являются вымышленными и не имеют никакого сходства с действительными почтовыми индексами живыми или мертвыми)

Ответы [ 5 ]

28 голосов
/ 18 декабря 2008

Да: попробуйте этот SQL-запрос.

Select cols from MyTable where zip in (90210, 23310, ... etc.)
17 голосов
/ 18 декабря 2008

Зависит от определения «элегантный»:)

Однако с таким большим количеством почтовых индексов, я думаю, вы, возможно, захотите управлять ими и в БД.

Как вы решаете, с какими почтовыми индексами сопоставляться?

Чтобы вы могли поместить почтовые индексы в собственную таблицу и сделать

SELECT cols FROM MyTable, ZipTable WHERE MyTable.zip = ZipTable.zip
10 голосов
/ 18 декабря 2008

Или комбинация обоих, вложенный запрос:

SELECT cols FROM MyTable WHERE zip IN 
    (SELECT zip FROM ZipTable WHERE condition=true)
3 голосов
/ 18 декабря 2008

Я бы использовал что-то вроде:

  • start transaction;
  • create temporary table if not exists ZIPS(ZIP integer) storage=memory;
  • insert into ZIPS (ZIP) VALUES(...)
  • select COLS from MYTABLE M, ZIPS Z where Z.ZIP = M.ZIP
  • drop table ZIPS (или обрежь это или сделай что хочешь)
  • или commit или rollback

В каждом db API у вас должна быть некоторая разновидность функции executemany , которая может вызывать insert into TABLE(COLUMNS) VALUES с несколькими строками значений и быть быстрее, чем повторение одной вставки. И вы можете обернуть такую ​​последовательность вызовов в некоторую функцию для легкого повторного использования, так как временная таблица с одним столбцом INT часто удобна: -)

Таким образом, вы можете избежать проблем с максимальной длиной запроса SQL (например, MySQL), и ваш запрос эффективен, чист и прост в обслуживании или расширении.

0 голосов
/ 24 января 2012

С таким количеством элементов вам действительно нужно создать справочную таблицу, особенно если вам нужно регулярно просматривать их в других разделах кода. Это будет инкапсулировать ваш код, что приведет к более легкому редактированию, если он используется в нескольких функциях и улучшит эстетику чтения.

Пример: - создать таблицу Поиск и заполнить столбец значений с вашим набором почтовых индексов в этом случае

SELECT Cols 
FROM MyTable  
WHERE EXISTS (Select * FROM Lookups WHERE MyTable.zip = Lookups.values)

с использованием JOIN

SELECT DISTINCT Cols
FROM MyTable JOIN
     Lookups ON MyTable.zip = Lookups.values
...