SQL: отметьте, какое условие ГДЕ соответствует - PullRequest
2 голосов
/ 14 февраля 2010

Это теоретический вопрос, мне было интересно, есть ли хороший способ выяснить, какое условие в операторах WHERE соответствует.

Скажите, что у меня такой запрос:

SELECT * FROM table WHERE
    COND1 OR
    (COND2 AND COND3) OR
    COND4

Есть ли способ узнать, какое из условий сделало данную строку подходящей (или не совпадающей)?


Одним из решений, о котором я подумал, было добавление предложения CASE в SELECT и повторное выполнение всех условий WHERE для этой строки:

SELECT *, which_cond = CASE .... END CASE ...

Ответы [ 2 ]

3 голосов
/ 14 февраля 2010

CASE возможно. Но короче, чтобы написать было бы IF() (по крайней мере с MySQL):

SELECT *, IF(COND2, 1, 0) AS cond2, IF(COND3, 1, 0) as cond3 ... 

и каждый cond* соответствует, если его значение равно 1.

Конечно, нет смысла проверять, совпадает ли COND1 или нет. Для всех результатов, которые вы получите, COND1 было правдой. Так что IF(COND1, 1, 0) всегда будет возвращать 1 (в вашем примере).

Обновление
Опять же, по крайней мере для MySQL, я обнаружил, что следующего достаточно для того, чтобы получить в качестве результата 1 или 0:

SELECT *, COND2 AS cond2, COND3 as cond3 ...

и в отношении ответа Марка вы можете избежать написания условий дважды, если вы используете HAVING вместо WHERE (HAVING в качестве доступа к псевдонимам):

SELECT *, COND2 AS cond2, COND3 as cond3
FROM table
HAVING COND1 AND (cond2 OR cond3)

(примечание: верхний регистр означает фактическое выражение условия, а нижний регистр - псевдоним)

Обновление 2:

Ну, это не так сильно меняется: вам нужно только проверить условия, которые подключены через OR в вашей обновленной версии, достаточно проверить, является ли COND2 истинным или нет. Если это так, то COND3 также верно и наоборот.

SELECT *, COND1 AS cond1, COND2 as cond2, COND4 as cond4
FROM table
HAVING cond1 OR (cond2 AND COND3) OR cond4

Я думаю, суть ясна.

1 голос
/ 14 февраля 2010

Ваш метод работает, но он требует, чтобы вы дважды напечатали все условия, и если они являются сложными выражениями, которые могут раздражать. Дублирование кода также приводит к ошибкам, когда необходимо изменить условия, и вы забыли обновить оба места. Вместо этого я бы предложил использовать подвыбор для оценки условий, а затем использовать псевдонимы:

SELECT *,
       CASE WHEN Cond1 AND Cond2 THEN 'Foo'
            ELSE 'Bar'
       END AS WhichCondition
FROM (SELECT *,
           (...SQL FOR COND1...) AS Cond1,
           (...SQL FOR COND2...) AS Cond2,
           (...SQL FOR COND3...) AS Cond3
           FROM table) AS T1
WHERE Cond1 AND (Cond2 OR Cond3)

В SQL Server и Oracle вы можете использовать CTE вместо подзапроса. Я этого не делал, потому что вы также использовали тег MySql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...