Подтвердить что ты не робот

Использование COALESCE для обработки значений NULL в PostgreSQL

У меня есть следующий запрос

SELECT  DISTINCT 
     pt.incentive_marketing, 
     pt.incentive_channel, 
     pt.incentive_advertising 
FROM test.pricing pt 
WHERE pt.contract_id = 90000 
group by 1,2,3 
order by pt.incentive_marketing;

Вышеприведенный запрос возвращает o/p, как показано на прилагаемом изображении enter image description here

Однако я хочу заменить все нулевые значения на 0, используя COALESCE Пожалуйста, дайте мне знать, как это может быть достигнуто в предыдущем запросе SELECT

Теперь я дополнительно изменил запрос, используя coalesce, как показано ниже

SELECT  
     COALESCE( pt.incentive_marketing, '0' ), 
     COALESCE(pt.incentive_channel,'0'), 
     COALESCE( pt.incentive_advertising,'0') 
FROM test.pricing pt 
WHERE pt.contract_id = 90000 
group by 1,2,3 

результат которого указан на рисунке 2.

Я все еще получаю одну строку с пустыми значениями

4b9b3361

Ответ 1

Вы можете использовать COALESCE в сочетании с NULLIF для короткого, эффективного решения:

COALESCE( NULLIF(yourField,'') , '0' )

Функция NULLIF будет возвращать значение null, если вашField равен второму значению ('' в этом случае), делая COALESCE полностью работает во всех случаях:

                 QUERY                     |                RESULT 
---------------------------------------------------------------------------------
SELECT COALESCE(NULLIF(null  ,''),'0')     |                 '0'
SELECT COALESCE(NULLIF(''    ,''),'0')     |                 '0'
SELECT COALESCE(NULLIF('foo' ,''),'0')     |                 'foo'

Ответ 2

Если вы используете 0 и пустую строку '' и null для обозначения undefined, у вас есть проблема с данными. Просто обновите столбцы и исправьте свою схему.

UPDATE pt.incentive_channel
SET   pt.incentive_marketing = NULL
WHERE pt.incentive_marketing = '';

UPDATE pt.incentive_channel
SET   pt.incentive_advertising = NULL
WHERE pt.incentive_marketing = '';

UPDATE pt.incentive_channel
SET   pt.incentive_channel = NULL
WHERE pt.incentive_marketing = '';

Это сделает соединение и выбор значительно легче двигаться вперед.