1

我在 postgres 中创建了一个新报告 - 它应该仅在有 3 个已完成的案例时运行,然后根据个别案例确定最终结果(通过/失败)。根据是通过还是失败,需要显示不同的信息。

我有我需要的三个主要查询,但现在我不知道如何将它们组合成一个。

包含案例条件逻辑的主要查询在这里:

SELECT CASE 
WHEN (SELECT COUNT(*) FROM "Alloc" WHERE "CodeID" = 1 AND "StatusCodeID" IN (2,6)) = 3
THEN 
    --Determine if case passes based on the 3 individual Assessments
    CASE 
    WHEN (SELECT COUNT(*) FROM "Answer" ans
        LEFT JOIN "AnswerOption" ansop ON ansop."AnswerOptionID" = ans."AnswerOptionID"
        LEFT JOIN "QuestionTextInstance" qtxti ON qtxti."QuestionTextInstanceID" = ans."QuestionTextInstanceID"
        LEFT JOIN "Alloc" aloc ON aloc."AllocID" = qtxti."AllocID"
        LEFT JOIN "QuestionText" qtxt ON qtxt."QuestionTextID" = qtxti."QuestionTextID"
        LEFT JOIN "Code" bcode ON aloc."CodeID" = bcode."CodeID" 
        WHERE bcode."CodeID" = 1 AND qtxt."QuestionTextID" = 11 AND ans."Value" = 0) >= 1 --At least 2 must have answered 'Yes'
    THEN 'Passed' --Execute 'Pass.sql'
    ELSE 'Did NOT Pass' --Execute 'NotPass.sql
    END
ELSE 'Report did Not Run'
END

这可以正确运行并根据条件给出正确的结果。但是,在内部语句的THENandELSE块中CASE,我需要显示不同的信息,包括许多列和许多连接(我目前在不同.sql的文件中)而不是Pass/ Did NOT Pass,但我找不到实现这一点的方法,因为它似乎THEN或块内的任何查询ELSE只能返回一个值。

我怎样才能做到这一点?

4

1 回答 1

2

它可以通过各种方式在纯 SQL中完成。一种是众所周知的复合/行类型:

SELECT (x).*
FROM (
   SELECT CASE WHEN cond_a_here THEN
                (SELECT t FROM t WHERE x = 1)
          ELSE  (SELECT t FROM t WHERE x = 2) END AS x
   ) sub

注意 中的括号(x).*。这些是复合类型所必需的,以使语法明确

使用PL/pgSQL容易理解,但您需要了解如何处理复合类型。我已经发布了许多相关的答案...

CREATE OR REPLACE FUNCTION foo_before()
  RETURNS SETOF t AS
$func$
BEGIN
IF cond_a_here THEN
   RETURN QUERY
   SELECT * FROM t WHERE x = 1;
ELSE
   RETURN QUERY
   SELECT * FROM t WHERE x = 2;
END IF;
END
$func$ LANGUAGE plpgsql;
于 2013-06-21T22:42:39.807 回答