【问题标题】:How to implement multiple if clauses using logical operator in Postgresql如何在 Postgresql 中使用逻辑运算符实现多个 if 子句
【发布时间】:2020-05-01 01:58:27
【问题描述】:

我有 3 张表,我必须根据以下条件检查某些记录的计数。

IF

count(T1DM DX = 0) & COUNT (T2DM DX = 0) & COUNT (T2DM MEDS >= 1) & COUNT(ABC > 6.5 OR DEF > 11.1 OR GHI > 7) >= 1 THEN "CASE"

ELSE

DO NOTHING

**OR** 

IF

count(T1DM DX = 0) & COUNT (T2DM DX >=1) & COUNT (T1DM MEDS = 0) & COUNT (T2DM MEDS = 0) & COUNT(ABC > 6.5 OR DEF > 11.1 OR GHI > 7) >= 1 THEN "CASE"

ELSE

DO NOTHING

我的创建表语句如下

CREATE TABLE DX(
   DX_id  serial Primary Key
   person_id NOT NULL,
   condition_name VARCHAR (50) UNIQUE NOT NULL,
   cond_id VARCHAR (355) UNIQUE NOT NULL,
   condition_start_date TIMESTAMP NOT NULL,
   condition_end_date TIMESTAMP NOT NULL
);


CREATE TABLE RX(
   RX_id serial Primary Key
   person_id NOT NULL,
   presciption_name VARCHAR (50) UNIQUE NOT NULL,
   presc_id VARCHAR (355) UNIQUE NOT NULL,
   pres_start_date TIMESTAMP NOT NULL,
   pres_end_date TIMESTAMP 
);


CREATE TABLE Lab(
   Lab_id serial Primary Key
   person_id NOT NULL,
   Test_name VARCHAR (50) UNIQUE NOT NULL,
   Test_id VARCHAR (355) UNIQUE NOT NULL,
   Test_start_date TIMESTAMP NOT NULL,
   Test_value FLOAT
);

这是我尝试过的

IF ((select count(*) from public.DX where cond_id = 21) == 0 AND (select count(*) from public.DX where cond_id = 23) == 0 AND (select count(*) from public.RX where presc_id = 33) >=1
                                 AND (select count(*) from (select * from public.Lab where test_id in (41,42,43)) where test_value > 6.5)) THEN "FOUND"
ELSE
     DO NOTHING

但这会引发错误。谁能帮我实现多个 if 子句与它们之间的 AND/OR 逻辑运算符?

注意事项

1) DX 表可以有多个条件。根据流程图,我们需要寻找 T1DM 和 T2DM。我们可以使用 cond_ids (T1DM - 21, T2DM - 23) 来识别它们

2) RX 表可以有多个处方药。根据流程图,我们需要寻找 T1DM 药物和 T2DM 药物。我们可以使用 presc_ids (T1DM meds- 31, T2DM meds - 33) 识别它们

3) 实验室表可以有多个测量/测试结果。根据流程图,异常实验室定义为下列 3 种测量中的任何一种的阈值违规。

 a) Three measurements - ABC, DEF, GHI. Test_ids for these three are 41,42,43
 b) ABC > 6.5
 c) DEF > 11.1
 d) GHI > 7

【问题讨论】:

  • 将您不清楚的演示片段与the apparent source of the diagram for this from your deleted earlier question about this 进行比较:“算法 1 T2DM 病例选择算法。该算法将患者级别记录 (pt) 作为参数,并且返回患者的病例状态 ({CASE; UNKNOWN}) 作为结果。"等等。
  • “抛出错误”是什么意思?当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入和输出,了解什么是误解、错字、错误的推理等导致了它。 (调试基础。)询问一下。请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。
  • 我已经给出了我试过的代码

标签: sql postgresql if-statement select where-clause


【解决方案1】:

您可以使用 CASE 表达式以及存在逻辑来编写此代码:

CASE WHEN
    NOT EXISTS (SELECT 1 FROM public.DX WHERE cond_id IN (21, 23)) AND
    EXISTS (SELECT 1 FROM public.DX WHERE presc_id = 33) AND
    EXISTS (SELECT 1 FROM public.Lab WHERE test_id IN (41,42,43) AND test_value > 6.5)
     THEN 'FOUND' END;

【讨论】:

  • 您好,感谢您的回复。赞成。几个小时后会更新。但是我可以知道“从表中选择 1”是做什么的吗?我在旅行时无法尝试
  • @TheGreat 。 . . EXISTS 只关心子查询是否返回至少一行;它不在乎该行上的列是什么。 1 可能是最简单的表达式。
  • @Gordon 谢谢你,我现在正在打电话。旁注:Postgres 并不真正关心EXISTS 后面的内容,甚至NULL(或根本没有)也可以跟随。
  • 嗨@TimBiegeleisen - 我正在尝试这样的事情select case when exists (SELECT distinct c_id FROM table_1 m JOIN dum_cts on (m.drcpt_id = dcpt_id and dcode_id in(3))) THEN "found" end from main_table;
  • 我正在尝试从 main_table 中选择 c_id 记录。 c_id 来自 table_1。假设main_table 有 30 条记录,table_1 有 100 个唯一的 c_id。所以我期待main_table 返回 20 条记录,因为两者之间有 20 个共同的 c_id。
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多