3

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

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
...

(这篇文章中的邮政编码是虚构的,与实际生活或死亡的邮政编码没有任何相似之处)

4

5 回答 5

28

是的:试试这个 sql 查询。

Select cols from MyTable where zip in (90210, 23310, ... etc.)
于 2008-12-18T09:39:31.827 回答
17

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

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

您如何决定要匹配哪些邮政编码?

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

SELECT cols FROM MyTable, ZipTable WHERE MyTable.zip = ZipTable.zip
于 2008-12-18T09:43:53.800 回答
10

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

SELECT cols FROM MyTable WHERE zip IN 
    (SELECT zip FROM ZipTable WHERE condition=true)
于 2008-12-18T09:47:26.350 回答
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 (或截断它或做任何你想做的事)
  • 要么commit_rollback

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

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

于 2008-12-18T11:26:11.067 回答
0

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

示例: --create table Lookups 并在这种情况下使用您的邮政编码集填充列 Values

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

使用加入

SELECT DISTINCT Cols
FROM MyTable JOIN
     Lookups ON MyTable.zip = Lookups.values
于 2012-01-23T21:24:24.503 回答