NVL использует регистр в запросе - PullRequest
1 голос
/ 11 апреля 2019

У нас есть запрос, который использует регистр в выражении NVL. Однако я думаю, что NVL можно удалить

Пожалуйста, обратитесь к части запроса ниже -

select f1, NVL((
        CASE
            WHEN PROD_CD = 'ESALE'
            THEN SUM (prod_count)
            WHEN PROD_CD = 'RSALE'
            THEN (SUM (prod_count) * -1)
            ELSE NULL
        END),0) AS SALEQTY

Можем ли мы также избежать NVLнаписав вот так

select f1, 
        CASE
            WHEN PROD_CD = 'ESALE'
            THEN SUM (prod_count)
            WHEN PROD_CD = 'RSALE'
            THEN (SUM (prod_count) * -1)
            ELSE 0
        END AS SALEQTY,

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Во-первых, это странная конструкция. Во-вторых, я предпочитаю COALESCE() (стандартная функция) NVL() - но это не имеет значения.

Вам понадобится NVL() / COALESCE(), если все значения prod_count могут быть NULL для данной группы. Если это так, то вам нужна внешняя проверка. Простое добавление ELSE в другой столбец не помогает.

Также отмечу, что логика выглядит подозрительно. Обычно CASE идет в качестве аргумента для SUM() - и проверка NULL обычно не требуется:

SELECT f1, 
       SUM(CASE WHEN PROD_CD = 'ESALE'
                THEN prod_count
                WHEN PROD_CD = 'RSALE'
                THEN - prod_count
                ELSE 0
            END) AS SALEQTY,
1 голос
/ 11 апреля 2019

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

Возможно, если NVL был первым, а кто-то добавил оператор case позже и не хотел связываться с текущим кодом. Так как я не думаю, что на самом деле есть разница в производительности, если она останется, это будет больно, но это также сделает ее более трудной для понимания, поэтому она может остаться, но у нее нет причин оставаться.

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