CASE WHEN在Oracle SQL Developer中的join语句中

时间:2017-07-18 17:55:26

标签: oracle-sqldeveloper case-when

我在Oracle SQL Developer中编写了这段代码,但我不知道如何使用CASE WHEN,以便当 k.QUARANTINED = 0 时,显示'否& #39;,否则如果k.QUARANTINED = 1则显示'是'。此列始终为0或1。      select s.NAME as "Shipment ID" ,k.STATUS_ID as "Status" ,k.EXPIRATION ,k.DISDATE ,u.SCR_NO as "Patient No" ,k.QUARANTINED ,k.PREVIOUS_STATUS_ID ,k.SORT_KEY as "Sort Order" from KIT k left join SHIPMENT s on s.ID = k.SHIPMENT_ID left join USR u on u.PAT_ID = k.PAT_ID;

我尝试了几次,但最不可能出现错误,因为我不知道如何正确编写语法或者我必须完全不同地重写它?我希望保持列的顺序相同。我只想看到'是'或者'否'对于k.Quarantined而不是结果中返回的0或1。 :)

1 个答案:

答案 0 :(得分:0)

SELECT
    S.name                     AS "shipment ID",
    K.status_id                AS "status",
    K.expiration,
    K.disdate,
    U.scr_no                   AS "Patient No",
    K.quarantined,
    CASE k.quarantined
        WHEN 0 THEN 'No'
        WHEN 1 THEN 'Yes'
        ELSE 'Missing or Null'
    END                        AS "quarantine status case example 1",
    CASE
        WHEN k.quarantined = 0
            THEN 'No'
        WHEN k.quarantined = 1
            THEN 'Yes'
        ELSE 'Missing or Null'
    END                        AS "quarantine status case example 2",
    K.previous_status_id,
    K.sort_key                 AS "sort order",
FROM Kit K
LEFT JOIN Shipment S
    ON K.shipment_id = S.id
LEFT JOIN USR U
    ON K.pat_id = U.pat_id
ORDER BY
    K.sort_key ASC
;

上述案例的两个例子。在评估单个列/变量时使用第一个示例。

第二个例子用于测试多个条件。

当使用CASE语句的第二个示例时,重要的是要理解CASE将返回第一个计算为TRUE的条件的结果。当使用复杂逻辑时,有时开发人员可能(无意中)具有重叠逻辑,其中可以满足多个条件。当CASE发生意外结果时,重要的是返回并从上到下重新评估该语句。

如果您完全确定K.quarantined不能为NULL并且它只能是0或1(研究表DDL以检查约束)那么您可以删除或注释掉CASE语句中的ELSE子句 - 但它一般来说,总是有一个ELSE子句来保持一致性。你可以简单地说明" ELSE NULL"如果除了CASE声明中描述的内容之外,你还没有想到任何其他内容。

最后,请务必确定K.quarantined是数字还是文本(检查表DDL)。如果它实际上是存储文本' 0' 0或者' 1'然后应相应地更改您的文字 - 尽管我认为当前版本的Oracle足够智能,可以为您进行隐式转换。