SQL: игнорировать условие в предложении WHERE - PullRequest
0 голосов
/ 27 сентября 2019

Я не совсем понимаю, как исключить одно из условий в предложении WHERE, если оно оценивается как NULL

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND (TB2.COL3 = (SELECT MIN(TB3.COL4)
FROM TB3
WHERE COL1 = TB2.COL1
AND COL2 in ('A', 'B') 
AND COL4 IN (SELECT COL3 FROM TB4 
WHERE COL1 = TB4.COL1))) 
AND ROWNUM = 1;

Как я могу изменить приведенный выше запрос, чтобы игнорировать "И условие TB2.COL3", еслиследующее условие SELECT MIN (TB3.COL4) FROM TB3 оценивается как некоторое значение, кроме NULL.Если NULL, вышеуказанный запрос должен быть выполнен следующим образом:

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND ROWNUM = 1;

1 Ответ

0 голосов
/ 27 сентября 2019

Я думаю, что вы могли бы осуществить это с объединением:

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND (TB2.COL3 = COALESCE((SELECT MIN(TB3.COL4)
FROM TB3
WHERE COL1 = TB2.COL1
AND COL2 in ('A', 'B') 
AND COL4 IN (SELECT COL3 FROM TB2 
WHERE COL1 = TB2.COL1)), TB2.COL3)) 
AND ROWNUM = 1;

Здесь мы просто оборачиваем этот оператор SELECT в COALESCE, который, если он возвращает ноль, вместо этого получит значение второго параметра,это тот же столбец, который мы сравниваем.Поскольку TB2.COL3 = TB2.COL3, очевидно, равно TRUE, этот фильтр не окажет никакого влияния на набор результатов.

Кроме того, обычно рекомендуется прекратить использовать запятые в предложении FROM и использовать правильный синтаксис JOIN.Он существует уже более 2 десятилетий:

SELECT
    TB1.COL3
FROM
    TB1
    INNER JOIN TB2
        ON TB1.COL1 = TB2.Col1
WHERE
    TB2.COL1 = '12345'
    AND
    (
        TB2.COL3 = COALESCE
        (
            (
                SELECT
                    MIN(TB3.COL4)
                FROM
                    TB3
                WHERE
                    COL1 = TB2.COL1
                    AND COL2 in ('A', 'B')
                    AND COL4 IN
                    (
                        SELECT
                            COL3
                        FROM
                            TB2
                        WHERE
                            COL1 = TB2.COL1
                    )
            ),
            TB2.COL3
        )
    )
    AND ROWNUM = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...