【问题标题】:SELECT WHERE ... hundreds of conditionsSELECT WHERE ...数百个条件
【发布时间】:2008-12-18 09:38:07
【问题描述】:

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

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

(本文中的邮政编码是虚构的,与实际存在或死亡的邮政编码没有任何相似之处)

【问题讨论】:

    标签: sql where


    【解决方案1】:

    是的:试试这个 sql 查询。

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

    【讨论】:

    • 最好将 ZIP 存储在一个表中并在 IN 子句中嵌入一个选择。
    • 甚至更好的是使用 'where exists' 或 join 而不是 'in'
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我同意。这种类型的查询通常表明您缺少表或列,或者您正在尝试执行数据库的用途:加入内容。
    【解决方案3】:

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

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

    【讨论】:

    • 在 MySQL 中 IN 不如 EXISTS 有效,所以(如果使用 MySQL)最好这样写:SELECT cols FROM MyTable M WHERE exists (SELECT 1 FROM ZipTable Z WHERE M.ZIP=Z .ZIP 和条件=true)
    【解决方案4】:

    我会使用类似的东西:

    • 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),并且您的查询有效、干净且易于维护或进一步扩展。

    【讨论】:

      【解决方案5】:

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

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

      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
      

      【讨论】:

      • 两个表上的简单连接会更容易阅读,并且在大多数情况下会提供更好的性能。 (是的,查找表是个好主意!)
      猜你喜欢
      • 2021-08-12
      • 2010-10-12
      • 1970-01-01
      • 2012-01-26
      • 2012-09-13
      • 2012-08-14
      • 2013-04-08
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多