2016-11-17 18 views
2
SELECT <A OR B> FROM my_table WHERE A=5 OR B=5; 

の値(A、B)があると言う:SELECT <A OR B> FROM my_table WHERE A = 5またはB = 5;

1,5 
2,5 
5,3 
5,4 

SELECTの結果は言い換える

1 
2 
3 
4 

なければならないIよりも(他の他の列の値を必要とします1つは、WHEREによって見つけられる)。あなたのデータベースを想定し

+0

1,5や5,1のような重複がありますか?もしそうなら、1を1回または2回表示したいですか? –

答えて

2

AB両方が数値ですと仮定すると、私は解決策を疑問に思いますCASE,UNION(いずれも一般的な解決策)またはこのようなクエリを使用すると、より高速に動作します。

SELECT (A + B - 5) AS OtherValue 
FROM Table 
WHERE A = 5 
OR B = 5; 
+0

ニースですが、数値データの場合にのみ有効ですが、もちろんケース/ユニオンソリューションはより一般的です。 –

2

case式をサポートし、同じデータ型の両方ABあると仮定すると - これは動作するはずです:

SELECT CASE WHEN A = 5 THEN B ELSE A END AS OtherValue 
FROM Table 
WHERE A = 5 
OR B = 5; 
3

あなたはこれを試すことができます:場合

SELECT 
    CASE WHEN a = 5 THEN b 
     ELSE a 
    END AS AorB 
FROM my_table 
WHERE a = 5 OR b = 5 

がありますあなたのSQLの方言にはCASEがありません。ただし、行の順序は保持されません。

SELECT b AS AorB FROM my_table WHERE a = 5 
UNION ALL 
SELECT a AS AorB FROM my_table WHERE b = 5 

このクエリでは、結果セットに重複した値が明示的に設定されています。異なる値を表示する場合は、ALLを省略してください。

+0

テーブルの順序が本質的に順序付けられていないため、行の順序は関係なくです。私は組合がすべて解決するのが好きです。 –

+0

適切なインデックスを持つ大きなテーブルの場合、UNION ALLアプローチはより良い実行計画を与える可能性があります。 – MatBailie

+0

@ ZoharPeledそれは本当です。明示的な 'ORDER BY'を追加しないと、順序は定義されません。私の経験からは、 "自然な"ソート順はプライマリキーによって決まります。しかし、私は決してそれに頼るつもりはない。 –

0

私はこれがうまくいくと思う:

SELECT CASE WHEN a = 5 THEN b ELSE a END val FROM #tmpAll WHERE 5 IN (a, b) 
+0

これは、他の列が5でない値も返します(サンプルデータに存在しないにもかかわらず、このような値が存在すると推測しています) –

+0

UNIONを使用する場合はDISTINCTは必要ありません – MatBailie

+0

これまでのコメントと同様に、これは '1,2,3,4'ではなく' 1,2,3,4,5'を返します。 – MatBailie

2

あなたは非常に読みやすいクエリを探しているなら、UNIONを使用します。

select a from my_table where b = 5 
union 
select b from my_table where a = 5; 
+0

...重複する値が許されない限り、' UNION ALL'を使う必要があります。 –

関連する問題