SELECT WHERE ......数以百计的条件

时间:2008-12-18 09:38:08

标签: sql where

有一种优雅的方式来做到这一点:

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 个答案:

答案 0 :(得分:28)

是:尝试此sql查询。

Select cols from MyTable where zip in (90210, 23310, ... etc.)

答案 1 :(得分:17)

取决于“优雅”的定义:)

但是,有了这么多邮政编码,我想你也可能想在数据库中管理它们。

您如何确定要匹配的邮政编码?

因此,您可以将邮政编码放在自己的表格中并执行

SELECT cols FROM MyTable, ZipTable WHERE MyTable.zip = ZipTable.zip

答案 2 :(得分:10)

或两者的组合,嵌套查询:

SELECT cols FROM MyTable WHERE zip IN 
    (SELECT zip FROM ZipTable WHERE condition=true)

答案 3 :(得分:3)

我会使用类似的东西:

  • 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(或截断它或做任何你想做的事)
  • commitrollback

在每个db API中,您应该有一些 executemany 函数的变体,它可以使用多个值行调用insert into TABLE(COLUMNS) VALUES并且比重复单个插入更快。你可以在一些函数中包含这样的调用序列,以便于重用,因为带有一个INT列的临时表通常很方便: - )

这样可以避免最大SQL查询长度问题(例如MySQL)的问题,并且您的查询有效,干净,易于维护或进一步扩展。

答案 4 :(得分:0)

有了这么多项,你真的应该创建一个查找表,特别是如果你需要在其他代码段中定期搜索它们。这将封装您的代码,如果它用于多种功能并更好地阅读美学,则可以更轻松地进行编辑。

实施例:      - 在这种情况下,使用您的邮政编码集创建表格查找和填充列值

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