首页 > 解决方案 > 修改 WHERE 声明以包括/排除某些患者

问题描述

2个类似的SQL Server问题:

db_members 是一个成员级别的表,按 Patient_id、provider_id 和 level_of_care_id 分类。

目的是将患者从不同的聚集水平中拉出来。

在第一个查询中,我们希望从这 6 个护理级别中提取所有患者,但对于 LOC 100.007,我们需要从一个 provider_id ('119282') 中排除患者;

在第二个查询中,我们希望从这 6 个护理级别中提取所有患者,但对于 LOC 100.007,我们只需要包含 provider_id ('119282') 患者;

(这是查询的简化版本)

select patient_id, provider_id, level_of_care_cd, 
from db_members 
where  level_of_care_cd in ('100.001', '100.004', '100.007', '100.022', '100.034', '100.037')      
group by level_of_care_cd, provider_id

标签: sqlsql-servertsql

解决方案


排除具有一个 LOC 的提供商

where level_of_care_cd in ( <full list> )
    and not (level_of_care_cd = '100.007' and provider_id = '119282')

只要空值不发挥作用,这就是等效的:

where level_of_care_cd in ( <full list> )
    and (level_of_care_cd <> '100.007' or provider_id <> '119282')

允许一个提供者拥有一个 LOC

小心空值:

where level_of_care_cd in ( <full list> )
    and not (level_of_care_cd = '100.007' and provider_id <> '119282')

where level_of_care_cd in ( <full list> )
    and (level_of_care_cd <> '100.007' or provider_id = '119282')

等价是德摩根定律的结果。使用的表格not可能会按照人们的思维方式最自然地阅读。请记住,or它的优先级低于and所以括号很重要。


推荐阅读