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

「エレガント」の定義によります:)

ただ、郵便番号が多いので、DBでも管理した方がいいのではないでしょうか。

照合する郵便番号をどのように決定しますか?

したがって、郵便番号を独自のテーブルに入れて、

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、複数の値の行で呼び出すことができ、単一の挿入を繰り返すよりも高速です。そして、そのような呼び出しシーケンスをいくつかの関数でラップして、簡単に再利用できるようにすることができます.1つの INT 列を持つ一時テーブルはしばしば便利です:-)

このようにして、SQL クエリの最大長の問題 (MySQL など) の問題を回避でき、クエリは効果的でクリーンで、維持または拡張が容易です。

于 2008-12-18T11:26:11.067 に答える
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
于 2012-01-23T21:24:24.503 に答える