web-dev-qa-db-ja.com

COALESCEを使用してPostgreSQLでNULL値を処理する

私は次のクエリを持っています

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

ただし、COALESCEを使用してすべてのヌル値を0に置き換えたい上記の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に添付されているとおりです。

私はまだ空の値を持つ1行を受け取ります

53
ronan

COALESCENULLIFと組み合わせて使用​​すると、短く効率的なソリューションを実現できます。

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

NULLIF関数 は、yourFieldが2番目の値(この場合は'')に等しい場合にnullを返し、COALESCE関数がすべての場合に完全に機能するようにします。

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

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

これにより、参加と選択が大幅に簡単になります。

6
Evan Carroll