【问题标题】:Replacing case with IIF in SQL Server在 SQL Server 中用 IIF 替换大小写
【发布时间】:2020-09-11 17:06:18
【问题描述】:
SELECT 
    patientname, patientinsurance, patienthistory,
    (CASE 
        WHEN patientinsurance IS NOT NULL THEN 'insured'
        WHEN CDPrintBatchId IS NULL THEN 'uninsured'    
     END) AS insurancestatus
FROM 
    [dbo]..database
WHERE
    admissiontime BETWEEN '2020-09-03' AND '2020-09-04'

所以对于我上面的查询,我想使用IIF 而不是CASE,因为我只想显示没有保险的患者,有什么正确的吗?因为如果我在我的案例场景中只使用一个案例,那么 null 应该会出现在我的 insurancestatus 列中,而不是 uninsurured。

SELECT 
    IIF(patient("Null") = 0, 'YES', 'NO');

基本上我只想在结果中显示 null 的结果,不包括 not null

【问题讨论】:

  • 你的问题有点不清楚。请使用预期结果和示例数据示例更新您的问题。
  • 天啊,我喜欢 IIF。这是今天最好的问题
  • case 语句比较两个独立的字段 - 但您的 IIF 示例正在测试一个条件。它看起来不像是您的 CASE 语句所做的直接逻辑替换。 CASE 语句有一个优先顺序,您不会在 IIF 语句中重复。您的 CASE 中也没有 ELSE。
  • I want to iif instead of case -> 为什么?
  • 当有标准 SQL 兼容的 CASE(更强大)时,为什么要使用专有语法(类似于 Oracle 的 DECODE),只是为了节省一些击键?

标签: sql sql-server case iif


【解决方案1】:

除了在所有 FALSE 情况下都返回“未投保”之外,此查询与已发布的查询相同。 insurancestatus 不会为 NULL

SELECT patientname, patientinsurance, patienthistory,
        iif(patientinsurance is not null, 'insured', 'uninsured') insurancestatus 
FROM [dbo]..database
where admissiontime between '2020-09-03' and '2020-09-04';

【讨论】:

  • 有没有办法只为被保险人,这意味着我不想关心未保险状态
  • 是的,如果您添加了 WHERE 子句:patientinsurance 不为空
  • 它不需要 iif 列,因为它只会返回被保险人
【解决方案2】:

所以您想消除所有“未投保”的记录?

那么为什么不对保险状态进行硬编码,并使用 where 子句限制来删除未保险记录。

SELECT patientname, patientinsurance, patienthistory, 
  CASE WHEN patientinsurance is null then 'uninsured' else 'insured' end as InsuranceStatus
FROM [dbo]..database
WHERE admissiontime between '2020-09-03' and '2020-09-04'
  AND 

【讨论】:

  • 嘿,对不起,我的意思是我想要 case 或 if,但只想添加一个 case 场景,其中某些内容为 null
  • 您能否将您的意思编辑到原始问题中。即使有这个细节,也不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2013-10-15
  • 2014-01-11
  • 1970-01-01
  • 2012-10-05
  • 2020-02-24
相关资源
最近更新 更多