我有一点脑痉挛,我不确定如何提问这个问题,所以我打算通过例子来做...
我有一个表table_a,有一些行,我需要根据2列进行选择。基本上,如果A和B为真,我想选择一行。但是如果B不成立,我需要选择A为真的行,B为另一个值。
所以给了这样一张桌子......
Col A ColB
1 'X'
1 'Y'
2 'Z'
我想说点......
给我ColA ='1'和ColB ='X'的所有行。如果不存在,请给我ColA ='1'和ColB ='Y'的行。但是如果(1,X)存在,我不想要(1,Y)。
让人惊讶。我怎样才能有效地做到这一点?
答案 0 :(得分:1)
我想使用此查询:
SELECT *
FROM yourtable
WHERE
(ColA, ColB) = (SELECT ColA, ColB FROM yourtable WHERE (ColA, ColB)=(1,'X')
UNION ALL
SELECT ColA, ColB FROM yourtable WHERE (ColA, ColB)=(1,'Y')
ORDER BY (ColA, ColB)=(1,'X') DESC
LIMIT 1)
如果至少有一行包含ColA=1
和ColB='X'
,则子查询将返回(1,'X'),否则如果至少有一行,则返回(1,'Y')
这样的价值观。
如果它们都存在,按(ColA, ColB)=(1,'X')
DESC排序并使用LIMIT 1
确保优先权被赋予(1, 'X')
。
或者使用OR的那个:
SELECT *
FROM yourtable
WHERE
((ColA, ColB) = (1, 'Y')
AND NOT EXISTS(SELECT NULL
FROM yourtable
WHERE (ColA, ColB)=(1,'X')))
OR
((ColA, ColB) = (1, 'X'))
请参阅小提琴here。
答案 1 :(得分:0)
我只想使用两个单独的查询来执行此操作。第一个查询是ColA = 1 AND colB = 'X'
。如果它没有返回结果,那么第二个查询将运行以获取(1, Y)
。
答案 2 :(得分:0)
如果我正确理解您的要求,只需使用LEFT JOIN
即可实现此方法。
SELECT T.ColA, T.ColB
FROM YourTable T
LEFT JOIN (
SELECT ColA
FROM yourtable T
WHERE ColB = 'X'
) T2 ON
T.ColA = T2.ColA
WHERE T.ColB = 'X' OR T2.ColA IS NULL
我假设同一个可乐有多个记录,返回一个colb = X(如果存在)。否则,按原样返回行 - 因此结果中为2 Z:
结果:
COLA COLB
1 X
2 Z
答案 3 :(得分:0)
select T.colA,T.colB
from table T
where T.colA = ANY (select colA from table where colB != T.colB);