it-swarm.com.de

Verwendung von COALESCE zur Behandlung von NULL-Werten in PostgreSQL

Ich habe folgende Frage

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;

Die obige Abfrage gibt das Ergebnis wie im angehängten Bild wieder enter image description here

Ich möchte jedoch alle Nullwerte mit COALESCE durch 0 ersetzen. Bitte lassen Sie mich wissen, wie dies in der obigen SELECT-Abfrage erreicht werden kann

Jetzt habe ich die Abfrage mithilfe von Coalesce wie folgt weiter modifiziert

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 

das Ergebnis ist in Abbildung 2 dargestellt.

Ich erhalte immer noch eine Zeile mit leeren Werten

53
ronan

Sie können COALESCE in Verbindung mit NULLIF für eine kurze, effiziente Lösung verwenden:

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

Die Funktion NULLIF gibt null zurück, wenn yourField dem zweiten Wert entspricht ('' in diesem Fall), wodurch die Funktion COALESCE in allen Fällen vollständig funktioniert:

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

Wenn Sie mit 0 Und einer leeren Zeichenfolge '' Und null undefiniert angeben, liegt ein Datenproblem vor. Aktualisieren Sie einfach die Spalten und korrigieren Sie Ihr Schema.

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

Dies erleichtert das Zusammenfügen und Auswählen erheblich.

6
Evan Carroll