类似XOR的Select语句

时间:2013-04-01 18:43:27

标签: mysql sql database

我有一点脑痉挛,我不确定如何提问这个问题,所以我打算通过例子来做...

我有一个表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)。

让人惊讶。我怎样才能有效地做到这一点?

4 个答案:

答案 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=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

答案 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

SQL Fiddle Demo

我假设同一个可乐有多个记录,返回一个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);