2016-03-20 79 views
1

我想编写一个SQL语句,该语句基于具有三种可能结果的CASE语句返回一个值。SQL在CASE语句为真时返回另一个表的值

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

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

我适应原来的SQL语句基于@Gordon Linoff答案的情况下,任何人合作想让它作为另一种选择:

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";