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

說出值(A,B)爲:SELECT <A OR B> FROM my_table其中A = 5或B = 5;

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

SELECT結果應該是

1 
2 
3 
4 

換句話說,我需要與其它列的值(比其它一個由WHERE發現)。

+0

是否可以重複1,5和5,1?如果是這樣,你想要顯示1次還是兩次? –

回答

2

假設都AB是數值,我不知道哪個解決方案使用CASE,UNION(兩者都是通用解決方案)或者像這樣的查詢:

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

不錯,雖然這隻適用於數字數據,當然...案例/聯盟解決方案更一般。 –

2

假設你的數據庫支持的情況下表達,並假設兩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

無論如何,行的順序無關緊要,因爲表格本質上是無序的。不過,我喜歡union all solution。 –

+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,5'而不是隻是'1,2,3,4' – MatBailie

2

如果你正在尋找一個非常可讀的查詢然後用UNION

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

...除非重複值被允許,在這種情況下,你需要使用'UNION ALL'。 –