gpt4 book ai didi

sql - 在 CASE 中运行复杂的 sql 查询

转载 作者:行者123 更新时间:2023-11-29 13:04:42 25 4
gpt4 key购买 nike

我在 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

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

我怎样才能做到这一点?

最佳答案

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

SELECT <b>(</b>x<b>)</b>.*
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).* 中的括号。这些是 required for a composite type to make the syntax unambiguous .

使用 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;

关于sql - 在 CASE 中运行复杂的 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com