42

特定の列の値のセットに基づいてテーブルをクエリする必要がある場合は、IN句を使用するだけです。

ただし、複数の列に基づいてクエリを実行する必要がある場合は、IN句(SOスレッドでgrepped)を使用できませんでした。

他のSOスレッドからは、joinsまたはexists句などを使用してこの問題を回避できます。ただし、メインテーブルと検索データの両方がデータベースにある場合はすべて機能します。

E.g
User table:
firstName, lastName, City

(firstname、lastName)タプルのリストが与えられたので、都市を取得する必要があります。

私は次の解決策を考えることができます。

1

次のような選択クエリを作成します。

SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....

2

すべてのfirstName、lastName値をステージングテーブルにアップロードし、「user」テーブルと新しいステージングテーブルの間で結合を実行します。

この問題を解決するためのオプションはありますか?また、この問題を一般的に解決するために好ましいことは何ですか?

4

6 に答える 6

99

あなたはこのようにすることができます:

SELECT city FROM user WHERE (firstName, lastName) IN (('a', 'b'), ('c', 'd'));

sqlfiddle

于 2012-10-23T09:49:36.287 に答える
5

クイッククエリを実行するだけの場合でも、データをデータベースにロードする方が簡単になることがよくあります。ハードコードされたデータはすぐに入力できるように見えますが、変更を加えなければならない場合はすぐに苦痛になります。

ただし、名前をクエリに直接コーディングする場合は、次の方法で簡単に行うことができます。

with names (fname,lname) as (
    values
        ('John','Smith'),
        ('Mary','Jones')
)
select city from user
    inner join names on
        fname=firstName and
        lname=lastName;

これの利点は、データをクエリからある程度分離することです。

(これはDB2構文です。システムを少し調整する必要があるかもしれません)。

于 2012-10-23T09:58:27.160 に答える
4

Oracleでは、次のことができます。

SELECT * FROM table1 WHERE (col_a,col_b) IN (SELECT col_x,col_y FROM table2)
于 2015-10-19T20:15:46.640 に答える
4

一般に、Where-Conditionは次のように簡単に記述できます。

select * from tab1
where (col1, col2) in (select col1, col2 from tab2)


Oracleは、選択された1つ以上の列がNULLである行を無視します。このような場合、おそらくNVL -Funktionを使用して、NULLを特別な値(値に含めるべきではない)にマップする必要があります。

select * from tab1
where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2)

于 2017-02-10T07:23:19.990 に答える
2

名と姓の列にインデックスがあり、1を使用していることを確認してください。これは、パフォーマンスにほとんど影響を与えません。

編集:プランキャッシュのスパムに関する@Demsのコメントの後、より良い解決策は、連結された名+姓の値を含む既存のテーブル(または別のビュー)に計算列を作成することです。これにより、次のようなクエリを実行できます。

SELECT City 
FROM User 
WHERE Fullname in (@fullnames)

@fullnames少し似ているところ"'JonDoe', 'JaneDoe'"など

于 2012-10-23T09:51:26.633 に答える
0

名前のリストがクエリごとに異なるか、再利用されるかを判別します。再利用する場合は、データベースに属します。

クエリごとに一意であっても、#tableパフォーマンス上の理由から一時テーブル(構文)にロードすると便利な場合があります。その場合、複雑なクエリの再コンパイルを回避できます。

名前の最大数が固定されている場合は、パラメーター化されたクエリを使用する必要があります。

ただし、上記のいずれにも当てはまらない場合は、アプローチ#1のように、クエリに名前をインライン化することにします。

于 2012-10-23T09:54:58.733 に答える