Использование COALESCE для обработки нулевых значений в 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 query

теперь я дополнительно изменил запрос, используя 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.

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

2 ответов


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

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

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

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

если вы используете 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 = '';

это сделает присоединение и выбор существенно проще двигаться вперед.