2015-01-06 6 views
30

とENDは私のテーブルの抽出物である:PostgreSQLのCASE ...ここでは複数の条件

gid | datepose | pvc 
---------+----------------+------------ 
1  | 1961   | 01 
2  | 1949   | 
3  | 1990   | 02 
1  | 1981   | 
1  |    | 03 
1  |    | 

私は怒鳴るようSELECT CASEを使用してPVC列を記入します:

SELECT 

gid, 

CASE 
    WHEN (pvc IS NULL OR pvc = '') AND datpose < 1980) THEN '01' 
    WHEN (pvc IS NULL OR pvc = '') AND datpose >= 1980) THEN '02' 
    WHEN (pvc IS NULL OR pvc = '') AND (datpose IS NULL OR datpose = 0) THEN '03' 
END AS pvc 

FROM my_table ; 

結果はソーステーブルと同じ内容ですが、何も起こらず、pg_logファイルにエラーメッセージが表示されません。構文エラー、またはWHEN句内で複数の条件を使用する際の問題かもしれません。

ありがとうございました!

+0

にあなたのために働く必要があります(ので、我々はNULLと空の文字列との違いを見ることができますか)? inと同様に、NULLを含む文字列 – Paco

+2

また、かっこでも問題があります。なぜ1980年以降に締め金があるのですか? (両方の場所で) – Paco

答えて

56

この種のコードは、おそらくあなたはそれがnullであるNULL値を表示することができ

SELECT 
*, 
CASE 
    WHEN (pvc IS NULL OR pvc = '') AND (datepose < 1980) THEN '01' 
    WHEN (pvc IS NULL OR pvc = '') AND (datepose >= 1980) THEN '02' 
    WHEN (pvc IS NULL OR pvc = '') AND (datepose IS NULL OR datepose = 0) THEN '03' 
    ELSE '00' 
END AS modifiedpvc 
FROM my_table; 


gid | datepose | pvc | modifiedpvc 
-----+----------+-----+------------- 
    1 |  1961 | 01 | 00 
    2 |  1949 |  | 01 
    3 |  1990 | 02 | 00 
    1 |  1981 |  | 02 
    1 |   | 03 | 00 
    1 |   |  | 03 
(6 rows) 
+1

ほとんど完璧;-)! 'ELSE '00'を' ELSE pvc'に置き換えて、 'pvc'カラムに既存の値を残すことができます。それ以外の場合は' 00 '(ケース 'pvc IS NOT NULL')でスクラッチします。どうもありがとう! – wiltomap