【问题标题】:Postgresql case statement returns empty row when condition is not met不满足条件时,Postgresql case 语句返回空行
【发布时间】:2020-01-24 15:22:31
【问题描述】:

我在query 中有以下声明:

CASE 
  WHEN "PI".statusid_dec = 'Entered' 
   and "PI".pagename = 'Procedural Information' 
   and "PI".pishact IS NULL 
   then 'ACT (Activated Clotting time)' 
END

问题是,如果有 "PI".pagename is NOT 'Procedural Information' 的记录,我会为这些情况获得额外的(空白)行。如何修改此查询,以便每次 'case when' 语句完全匹配时我只得到一行?

完整查询:

SELECT

DISTINCT "DAT_SUB".SUBNUM as "Subject ID",

CONCAT_WS(',',

CASE WHEN "DM".statusid_dec = 'Entered' and "DM".sex IS NULL then 'Gender' 
END,
CASE WHEN "DM".statusid_dec = 'Entered' and "DM".brthyr IS NULL then 'Year 
of 
Birth' END,
CASE WHEN "DM".statusid_dec = 'Entered' and "DM".icdat IS NULL then 
'Informed 
consent date' END) as "Demographics",

CASE WHEN "PI".statusid_dec = 'Entered' and "PI".pagename = 'Procedural 
Information' and "PI".pishact IS NULL then 'ACT (Activated Clotting time)' 
END 
as "Procedure"

FROM "Disco_Radial"."DAT_SUB"
//These are all the tables I want to add similar case-statements for. They 
are currently not being used yet, because I wanted to solve this issue 
above first. 

LEFT JOIN "Disco_Radial"."ACM" ON "Disco_Radial"."ACM".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."AE" ON "Disco_Radial"."AE".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."CH" ON "Disco_Radial"."CH".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."CL" ON "Disco_Radial"."CL".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."CRF" ON "Disco_Radial"."CRF".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."DIS" ON "Disco_Radial"."DIS".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."DM" ON "Disco_Radial"."DM".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."IE" ON "Disco_Radial"."IE".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."LB" ON "Disco_Radial"."LB".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."PA" ON "Disco_Radial"."PA".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."PE" ON "Disco_Radial"."PE".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."PI" ON "Disco_Radial"."PI".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."SE" ON "Disco_Radial"."SE".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."SS" ON "Disco_Radial"."SS".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."VS" ON "Disco_Radial"."VS".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."DAT_RAND" ON "Disco_Radial"."DAT_RAND".SUBNUM = 
"DAT_SUB".SUBNUM
LEFT JOIN "Disco_Radial"."DAT_PAGS" ON "Disco_Radial"."DAT_PAGS".SUBNUM = 
"DAT_SUB".SUBNUM

ORDER BY "DAT_SUB".subnum;

输出如下所示:

"DR-05-001";"";"ACT(活化凝血时间)" “DR-05-001”;“”;“” "DR-05-002";"";"ACT(活化凝血时间)" "DR-05-003";"";"ACT(活化凝血时间)" "DR-05-004";"";"ACT(活化凝血时间)" "DR-05-005";"";"ACT(活化凝血时间)" "DR-05-006";"";"ACT(活化凝血时间)"

...

问题在于像 DR-05-001 这样的记录,它在“PI”表中的行没有页面名称“程序信息”。

【问题讨论】:

  • 整个查询会更好
  • @Zegher V 更改要求会使您已经获得的答案无效。您应该发布一个新问题,您可以在其中解释您想要什么。

标签: sql postgresql


【解决方案1】:

case 表达式只指定每行返回的值。如果要排除某些行,则需要添加带有该逻辑的 where 子句。

【讨论】:

  • 谢谢,但是如果我想从其他表中添加类似的语句怎么办?有没有办法让 where 子句只适用于一个输出列?
  • @ZegherV 不确定我是否理解您的评论。 where 子句过滤掉整行,而不是列
  • 是的,where 子句在当前查询中可以正常工作,但我的目标是创建类似的 case 语句,但来自其他表,这些表的列与此表不同。所以这就是为什么我现在不能使用 where 子句。有什么想法吗?
  • 是的,where 子句在当前查询中可以正常工作,但我的目标是创建类似的 case 语句,但来自其他表,这些表的列与此表不同。所以这就是为什么我现在不能使用 where 子句。有什么想法吗?
【解决方案2】:

WHERE "PI".pagename = 'Procedural Information' 添加到您的查询中,您可以将其从 CASE 表达式中删除:

SELECT
  CASE 
    WHEN "PI".statusid_dec = 'Entered' and "PI".pishact IS NULL 
    THEN 'ACT (Activated Clotting time)' 
  END
FROM "PI"
WHERE "PI".pagename = 'Procedural Information'

注意如果条件:

"PI".statusid_dec = 'Entered' and "PI".pishact IS NULL

不是TRUE 对于任何行,您仍然会在结果中得到空行。

【讨论】:

  • 是的,如果这是我想在此报告中创建的唯一列,那将是解决方案,但我希望从其他表中获得除“PI”之外的其他列。我编辑了我的帖子以获得完整的查询!
  • 此代码回答了您发布的问题。如果您有其他要求,则可以发布有关它的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2021-12-30
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多