2016-11-17 59 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'。 –