我有点脑筋急转弯,而且我不确定该如何表达这个问题,因此我将以示例的方式来做...

我有一个表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=1ColB='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/

10-14 11:07