2013-04-01 4 views
0

У меня немного судороги мозга, и я не знаю, как даже слово вопроса, так что я собираюсь сделать это на примере ...XOR типа Оператор Select

I есть таблица, table_a, с некоторым количеством строк, и мне нужно сделать выбор на основе двух столбцов. В основном я хочу выбрать строку, если А и В являются истинными. Однако, если B не является истинным, мне нужно выбрать строку, где A истинно, а B - другое значение.

Поэтому, учитывая таблицу, как это ...

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

Я хочу сказать, что-то вроде ...

Дайте мне все строки, где КОЛА = '1' и ColB = 'X' , Если этого не существует, дайте мне строки, где ColA = '1' и ColB = 'Y'. Но я не хочу (1, Y), если существует (1, X).

Yikes. Как я могу сделать это эффективно?

+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) 

Subquery будет возвращать либо (1, «X»), если есть по крайней мере одна строка, которая имеет ColA=1 и ColB='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); 
Смежные вопросы