Sql 选择<;A或B>;从我的_表中,A=5或B=5;

Sql 选择<;A或B>;从我的_表中,A=5或B=5;,sql,Sql,SELECT的结果应为 1,5 2,5 5,3 5,4 换句话说,我需要另一列中的值(由WHERE找到的值除外)。假设您的数据库支持大小写表达式,并且假设A和B都是相同的数据类型-这应该可以: 1 2 3 4 你可以试试这个: SELECT CASE WHEN A = 5 THEN B ELSE A END AS OtherValue FROM Table WHERE A = 5 OR B = 5; 如果您的SQL方言中没有case,我会想到另一种可能的解决方案,但是它不保留行的顺序 SE

SELECT
的结果应为

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

换句话说,我需要另一列中的值(由
WHERE
找到的值除外)。

假设您的数据库支持大小写表达式,并且假设
A
B
都是相同的数据类型-这应该可以:

1
2
3
4
你可以试试这个:

SELECT CASE WHEN A = 5 THEN B ELSE A END AS OtherValue
FROM Table
WHERE A = 5
OR B = 5;
如果您的SQL方言中没有
case
,我会想到另一种可能的解决方案,但是它不保留行的顺序

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

请注意,此查询明确允许结果集中存在重复值!如果您想看到不同的值,您应该省略
所有

我认为这会起作用:

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

如果要查找可读性很强的查询,请使用
UNION

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

假设
A
B
都是数值,我想知道使用
CASE
UNION
(都是通用解决方案)或类似这样的查询,哪个解决方案工作得更快:

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

行的顺序无论如何都是不相关的,因为表本质上是无序的。不过,我喜欢union all解决方案。对于具有适当索引的大型表,union all方法可能会提供更好的执行计划。@ZoharPeled确实如此。如果您不按
添加明确的
订单,则订单将未定义。根据我的经验,“自然”排序顺序是由主键决定的。但是,我从不依赖它。这也将返回其他列不是5的值(我猜在实际数据中有这样的值,即使它们不存在于样本数据中。如果使用Union,则不需要使用DISTINCT。根据前面的注释,这将返回
1,2,3,4,5
,而不仅仅是
1,2,3,4
至少第二个样本(在“或”之后)将返回任何内容,而不仅仅是
a=5或b=5
的行。是否会有重复的1,5和5,1?如果是,是否要显示1一次或两次?…除非允许重复值,在这种情况下,您需要使用
UNION ALL
。很好,尽管这只适用于数字数据,当然…case/UNION解决方案这些规则更为普遍。
select a from my_table where b = 5
union
select b from my_table where a = 5;
SELECT (A + B - 5) AS OtherValue
FROM Table
WHERE A = 5
OR B = 5;