我有点脑筋急转弯,而且我不确定该如何表达这个问题,因此我将以示例的方式来做...
我有一个表table_a,其中有一些行,我需要基于2列进行选择。基本上,如果A和B为true,我想选择一行。但是,如果B不是true,则需要选择A为true且B为另一个值的行。
所以给这样的一张桌子...
Col A ColB
1 'X'
1 'Y'
2 'Z'
我想说些类似...
给我所有的行,其中ColA ='1'和ColB ='X'。如果不存在,请给我其中ColA ='1'和ColB ='Y'的行。但是我不想要(1,Y)是否存在(1,X)。
kes我如何有效地做到这一点?
最佳答案
我想使用以下查询:
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。
关于mysql - 类似于XOR的Select语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15749505/