2016-03-20 1 views
1

3つの結果があるCASE文に基づいて値を返すSQL文を記述したいとします。CASE文が真のときに別のテーブルの値を返すSQL

1)列の値が「C0」で始まる場合、それはテーブル

2の二つの列の連結を返す)カラムが「L0」で始まる場合、別のカラム(_PARENT_PROJECT_NUMBER)の値を取りますその値が別のテーブルにあるかどうかを確認します。そうでない場合は、値_PARENT_PROJECT_NUMBERを戻します。

3)_PARENT_PROJECT_NUMBERが他のテーブルに存在する場合は、別のテーブル「Rollup_Project_Mapping」の「Rollup_Project」列の値を返します。

次の文は、12行目以外ではうまくいきます。"Rollup_Project_Mapping"."Rollup_Project" _PARENT_PROJECT_NUMBERが他のテーブルにある場合、他のテーブルの値を返すようにします。エラーメッセージは次のとおりです。

ERROR: syntax error at or near "FROM" 
LINE 12:  FROM "Rollup_Project_Mapping"."Rollup_Project" 

CASE文のこの部分が真の場合、他の表の値をどのように戻すことができますか?

SELECT 
CASE 
    WHEN LEFT("_PROJECT_NUMBER",2)='C0' THEN 
    '('||"_PROJECT_NUMBER"||') '||"_PROJECT_DESCRIPTION" 
    WHEN LEFT("_PROJECT_NUMBER",2)='L0' THEN 
    CASE 
     WHEN (SELECT "Rollup_Project" FROM "Project_Rollup_Mapping" WHERE "PA_ACCOUNTED_TEST"."_PARENT_PROJECT_NUMBER" = "Project_Rollup_Mapping"."Project") IS NOT NULL THEN 
     "Rollup_Project_Mapping"."Rollup_Project" 
    ELSE "_PARENT_PROJECT_NUMBER" 
    END 
END AS Rollup_Project2 
FROM "PA_ACCOUNTED_TEST"; 

答えて

3

あなたはWHEN/THEN文とEXISTSのセットだけ使用することができます誰もが別のオプションとして、それを望んでいた場合には、私は@Gordon Linoffの回答に基づいて動作するように、元のSQL文を適応

SELECT (CASE WHEN LEFT("_PROJECT_NUMBER",2) = 'C0' 
      THEN '('||"_PROJECT_NUMBER"||') '||"_PROJECT_DESCRIPTION" 
      WHEN LEFT("_PROJECT_NUMBER",2) = 'L0' AND 
        EXISTS (SELECT "Rollup_Project" FROM "Project_Rollup_Mapping" WHERE "PA_ACCOUNTED_TEST"."_PARENT_PROJECT_NUMBER" = "Project_Rollup_Mapping"."Project") 
        THEN (SELECT "Rollup_Project" FROM "Project_Rollup_Mapping" WHERE "PA_ACCOUNTED_TEST"."_PARENT_PROJECT_NUMBER" = "Project_Rollup_Mapping"."Project") 
      ELSE "_PARENT_PROJECT_NUMBER" 
     END) AS Rollup_Project2 
FROM "PA_ACCOUNTED_TEST"; 
+0

ありがとうございます!完璧に働いた! – christopheralan88

0

を:

SELECT 
CASE 
    WHEN LEFT("_PROJECT_NUMBER",2)='C0' THEN 
    '('||"_PROJECT_NUMBER"||') '||"_PROJECT_DESCRIPTION" 
    WHEN LEFT("_PROJECT_NUMBER",2)='L0' AND (SELECT "Rollup_Project" FROM "Project_Rollup_Mapping" WHERE "PA_ACCOUNTED_TEST"."_PARENT_PROJECT_NUMBER" = "Project_Rollup_Mapping"."Project") IS NOT NULL THEN 
    (SELECT "Rollup_Project" FROM "Project_Rollup_Mapping" WHERE "PA_ACCOUNTED_TEST"."_PARENT_PROJECT_NUMBER" = "Project_Rollup_Mapping"."Project") 
    ELSE "_PARENT_PROJECT_NUMBER" 
END AS Rollup_Project2 
FROM "PA_ACCOUNTED_TEST";