Улучшение обработки NULL в PL / SQL-запросе - PullRequest
0 голосов
/ 14 октября 2019

В приведенном ниже запросе не перечислены все записи, содержащие значение null в WFD_DETECTION_EPA, когда мы передаем какое-либо значение в переменную S1_WFD_OPERATION_CODE. В результате появляются только записи с WFD_DETECTION_EPA, отличным от null.

Как улучшить этот запрос?

           AND UPPER (FD.WFD_DETECTION_EPA) LIKE
                      '%'
                   || CASE
                         WHEN LENGTH (S0_WFD_DETECTION_EPA) > 0
                         THEN
                            UPPER (S0_WFD_DETECTION_EPA)
                         ELSE
                            '%'
                      END
                   || '%'
            AND UPPER (FD.WFD_OPERATION_CODE) LIKE
                      '%'
                   || CASE
                         WHEN LENGTH (S1_WFD_OPERATION_CODE) > 0
                         THEN
                            UPPER (S1_WFD_OPERATION_CODE)
                         ELSE
                            '%'
                      END
                   || '%'

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

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

(UPPER(FD.WFD_DETECTION_EPA) LIKE '%' || UPPER(S0_WFD_DETECTION_EPA) || '%' OR
 FD.WFD_DETECTION_EPA IS NULL
) AND
(UPPER(FD.WFD_OPERATION_CODE) LIKE '%' || UPPER(S1_WFD_OPERATION_CODE) || '%'
)

То есть выражение CASE не нужно.

2 голосов
/ 14 октября 2019

Вы можете использовать условие в сочетании с ИЛИ

AND (UPPER (FD.WFD_DETECTION_EPA) LIKE
                      '%'
                   || CASE
                         WHEN LENGTH (S0_WFD_DETECTION_EPA) > 0
                         THEN
                            UPPER (S0_WFD_DETECTION_EPA)
                         ELSE
                            '%'
                      END
                   || '%' OR FD.WFD_DETECTION_EPA IS NULL) -- this
            AND UPPER (FD.WFD_OPERATION_CODE) LIKE
                      '%'
                   || CASE
                         WHEN LENGTH (S1_WFD_OPERATION_CODE) > 0
                         THEN
                            UPPER (S1_WFD_OPERATION_CODE)
                         ELSE
                            '%'
                      END
                   || '%'

Приветствия !!

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