web-dev-qa-db-fra.com

Utiliser COALESCE pour gérer les valeurs NULL dans PostgreSQL

J'ai la requête suivante

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;

La requête ci-dessus renvoie le o/p comme indiqué dans l'image jointe enter image description here

Cependant, je souhaite remplacer toutes les valeurs nulles par 0 avec COALESCE Merci de me faire savoir comment cela peut être réalisé dans la requête SELECT ci-dessus

Maintenant, j'ai également modifié la requête en utilisant coalesce comme ci-dessous

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 

dont le résultat est tel qu'attaché dans l'image 2.

Je reçois toujours une ligne avec des valeurs vides

53
ronan

Vous pouvez utiliser COALESCE avec NULLIF pour une solution courte et efficace:

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

La fonction NULLIF retournera null si votre champ est égal à la deuxième valeur ('' dans ce cas, rendant la fonction COALESCE pleinement opérationnelle dans tous les cas:

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

Si vous utilisez 0 et une chaîne vide '' et null pour indiquer que vous avez un problème de données. Il suffit de mettre à jour les colonnes et de corriger votre schéma.

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

Cela facilitera considérablement l’adhésion et la sélection.

6
Evan Carroll