Как преобразовать предложение SQL WHERE, чтобы получить кортеж, который содержит значения NULL? - PullRequest
0 голосов
/ 26 марта 2020

У меня проблемы с фильтрацией указанного набора данных c из таблицы базы данных (я использую базу данных Oracle). Вот моя таблица (столбец MAX_END_DATE был рассчитан с помощью вспомогательного оператора):

ID    |     Quarter      |       BEGINN_DATE      |      END_DATE      |      MAX_END_DATE
------------------------------------------------------------------------------------------
21    |     01.01.2019   |       09.01.2019       |        NULL        |        09.01.2019
------------------------------------------------------------------------------------------
22    |     01.01.2019   |       03.01.2019       |     09.01.2019     |        09.01.2019
------------------------------------------------------------------------------------------
23    |     01.01.2019   |       02.01.2019       |     03.01.2019     |        09.01.2019

Если значение NULL существует в столбце END_DATE, который я хочу получить этот кортеж Но если в этом столбце нет значения NULL , я хочу получить кортеж, который включает MAX_DATE в столбце END_DATE. Чтобы решить эту проблему, я написал следующее предложение Where:

SELECT *
FROM myTable
WHERE end_date IS NULL
OR(
end_date IS NOT NULL AND
end_date = max_end_datum
);

С помощью этого предложения WHERE я получаю следующий результат:

ID    |     Quarter      |       BEGINN_DATE      |      END_DATE      |      MAX_END_DATE
------------------------------------------------------------------------------------------
21    |     01.01.2019   |       09.01.2019       |        NULL        |        09.01.2019
------------------------------------------------------------------------------------------
22    |     01.01.2019   |       03.01.2019       |     09.01.2019     |        09.01.2019
------------------------------------------------------------------------------------------

Как я должен преобразовать предложение WHERE, чтобы получить кортеж со значением NULL, когда это значение существует в столбце END_DATE?

Я хочу получить только этот результат, если в столбце END_DATE существует значение Null:

ID    |     Quarter      |       BEGINN_DATE      |      END_DATE      |      MAX_END_DATE
 ------------------------------------------------------------------------------------------
21    |     01.01.2019   |       09.01.2019       |        NULL        |        09.01.2019    -----------------------------------------------------------------------------

Я хочу получить только этот результат Если в столбце END_DATE нет нулевого значения:

 ID    |     Quarter      |       BEGINN_DATE      |      END_DATE      |      MAX_END_DATE
    ------------------------------------------------------------------------------------------    
 22    |     01.01.2019   |       03.01.2019       |     09.01.2019     |        09.01.2019
    ------------------------------------------------------------------------------------------

Я не хочу получать оба результата одновременно. Я хочу получить первый результат ИЛИ второй результат.

Спасибо за помощь!

// РЕДАКТИРОВАТЬ:

Я забыл упомянуть, что значения в четверти столбца могут быть переменной и не должно быть первым днем ​​любого квартала:

  ID    |     Quarter      |       BEGINN_DATE      |      END_DATE      |      MAX_END_DATE

  21    |     01.01.2019   |       01.01.2019       |     20.02.2019     |        21.02.2019
 ------------------------------------------------------------------------------------------
  22    |     21.02.2019   |       21.02.2019       |     21.02.2019     |        21.01.2019
    ------------------------------------------------------------------------------------------
  23    |     21.02.2019   |       22.02.2019       |       NULL         |        21.01.2019

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вы можете использовать analytical function следующим образом:

SELECT *
FROM ( SELECT T.*,
              SUM(CASE WHEN END_DATE IS NULL THEN 1 END) 
                OVER( PARTITION BY QUARTER) NULLCNT
         FROM MYTABLE T)
WHERE
    ( NULLCNT = 1 AND END_DATE IS NULL )
    OR ( NULLCNT = 0 AND END_DATE = MAX_DATE )
0 голосов
/ 26 марта 2020

Вы можете использовать функцию NVL https://www.techonthenet.com/oracle/functions/nvl.php для замены значения NULL на строку или символ.

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