2014-12-15 2 views
37

У меня есть следующий запросИспользование 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; 

Этот запрос возвращает о/р, как показано на прилагаемом изображении enter image description here

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

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

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'? Что именно пошло не так? –

+0

no I havent try, please show me using coalesce – ronan

+3

Затем, пожалуйста, попробуйте функцию coalesce() и сообщите о любой проблеме, с которой вы столкнулись. Прочтите руководство, если вы не знаете, как его использовать: http://www.postgresql.org/docs/current/static/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL - "* Нет, у меня нет попробовал * "не так, как работает SO. –

ответ

87

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

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

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

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

@ronan - этот ответ правильный и широко принятое решение, я думаю, вы должны принять этот. –

2

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

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 = ''; 

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

Смежные вопросы