2013-04-01 22 views
0

我有一個有點腦子抽筋的,我不知道如何連字的問題,所以我要以身作則做...XOR樣Select語句

我有一個表,table_a,有一些行數,我需要做一個基於2列的選擇。基本上我想選擇一個行,如果A和B是真的。但是,如果B不正確,我需要選擇A是真的而B是另一個值的行。

所以給出這樣的表...

Col A ColB 
1  'X' 
1  'Y' 
2  'Z' 

我想這樣說...

給我所有的行,其中可樂= '1' 和COLB = 'X' 。如果不存在,給我ColA ='1'和ColB ='Y'的行。但是我不想(1,Y)存在(1,X)。

哎呀。我怎樣纔能有效地做到這一點?

+0

你可以使用CASE語句? –

回答

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) 

子查詢將返回(1,「X」),如果有有ColA=1ColB='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

0

我只是使用兩個單獨的查詢來做到這一點。第一個查詢將是ColA = 1 AND colB = 'X'。如果它不返回結果,則第二個查詢將運行以獲取(1, Y)

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 
0
select T.colA,T.colB 
from table T 
where T.colA = ANY (select colA from table where colB != T.colB);