Sql 需要有关嵌套CASE语句的帮助吗

Sql 需要有关嵌套CASE语句的帮助吗,sql,oracle,nested,case,Sql,Oracle,Nested,Case,我需要用SQL重写下面的IF-THEN代码,下面是我的第一次尝试。但是当我运行SQL代码时,它返回了一条错误消息:ORA-00933:SQL命令未正确结束。有人能帮忙吗 另外,我想知道除了使用嵌套Case语句之外,是否还有更好的替代方法来重写SAS代码。我是SQL的新手。任何帮助都将不胜感激 /*****************SAS代码/ if Record_type = 'Cliam'and Claim_Type_E0141 in ('C','H','M','F','I','N','K','

我需要用SQL重写下面的IF-THEN代码,下面是我的第一次尝试。但是当我运行SQL代码时,它返回了一条错误消息:ORA-00933:SQL命令未正确结束。有人能帮忙吗

另外,我想知道除了使用嵌套Case语句之外,是否还有更好的替代方法来重写SAS代码。我是SQL的新手。任何帮助都将不胜感激

/*****************SAS代码/

if Record_type = 'Cliam'and Claim_Type_E0141 in ('C','H','M','F','I','N','K','Z') THEN DO;
if POS in ('21','22','23','24','25','26','27','28') then POS_new=31;
if POS in ('86') then POS_new=32;
if POS in ('81','82') then POS_new=34;
('61','62','63','64','65','66','67','68') then POS_new=54;
END;

if Record_type = 'Encounter'and ENCOUNTER_TYPE_H054 in ('I') THEN DO;
if BILL_TYPE_CODE_1_2 in ('21','22','23','24','25','26','27','28') then POS_new=31;
if BILL_TYPE_CODE_1_2 in ('86') then POS_new=32;
if BILL_TYPE_CODE_1_2 in ('81','82') then POS_new=34;
if BILL_TYPE_CODE_1_2 in ('61','62','63','64','65','66','67','68') then POS_new=54;
END;
UPDATE ALL_INPT
SET POS_new = 
     WHEN Record_type = "Claim" and Claim_Type_E0141 in ('C','H','M','F','I','N','K','Z')
          THEN CASE 
                WHEN POS in ('21','22','23','24','25','26','27','28')
                       THEN '31' 
                WHEN POS in ('86')
                       THEN '32' 
                WHEN POS in ('81','82')
                       THEN '34' 
                WHEN POS in ('61','62','63','64','65','66','67','68')
                       THEN '54' 
                ELSE POS
           END 

     WHEN Record_type = "Encounter" and ENCOUNTER_TYPE_H054in ('I')
          THEN CASE 
                WHEN BILL_TYPE_1_2_E0394 in ('21','22','23','24','25','26','27','28')
                       THEN '31' 
                WHEN BILL_TYPE_1_2_E0394 in ('86')
                       THEN '32' 
                WHEN BILL_TYPE_1_2_E0394 in ('81','82')
                       THEN '34' 
                WHEN BILL_TYPE_1_2_E0394 in ('61','62','63','64','65','66','67','68')
                       THEN '54'
                ELSE  BILL_TYPE_1_2_E0394
           END                  
END
/********************SQL代码/

if Record_type = 'Cliam'and Claim_Type_E0141 in ('C','H','M','F','I','N','K','Z') THEN DO;
if POS in ('21','22','23','24','25','26','27','28') then POS_new=31;
if POS in ('86') then POS_new=32;
if POS in ('81','82') then POS_new=34;
('61','62','63','64','65','66','67','68') then POS_new=54;
END;

if Record_type = 'Encounter'and ENCOUNTER_TYPE_H054 in ('I') THEN DO;
if BILL_TYPE_CODE_1_2 in ('21','22','23','24','25','26','27','28') then POS_new=31;
if BILL_TYPE_CODE_1_2 in ('86') then POS_new=32;
if BILL_TYPE_CODE_1_2 in ('81','82') then POS_new=34;
if BILL_TYPE_CODE_1_2 in ('61','62','63','64','65','66','67','68') then POS_new=54;
END;
UPDATE ALL_INPT
SET POS_new = 
     WHEN Record_type = "Claim" and Claim_Type_E0141 in ('C','H','M','F','I','N','K','Z')
          THEN CASE 
                WHEN POS in ('21','22','23','24','25','26','27','28')
                       THEN '31' 
                WHEN POS in ('86')
                       THEN '32' 
                WHEN POS in ('81','82')
                       THEN '34' 
                WHEN POS in ('61','62','63','64','65','66','67','68')
                       THEN '54' 
                ELSE POS
           END 

     WHEN Record_type = "Encounter" and ENCOUNTER_TYPE_H054in ('I')
          THEN CASE 
                WHEN BILL_TYPE_1_2_E0394 in ('21','22','23','24','25','26','27','28')
                       THEN '31' 
                WHEN BILL_TYPE_1_2_E0394 in ('86')
                       THEN '32' 
                WHEN BILL_TYPE_1_2_E0394 in ('81','82')
                       THEN '34' 
                WHEN BILL_TYPE_1_2_E0394 in ('61','62','63','64','65','66','67','68')
                       THEN '54'
                ELSE  BILL_TYPE_1_2_E0394
           END                  
END

)

两种情况下的内部
情况都相同。我会将此简化为:

UPDATE ALL_INPT
    SET POS_new = (CASE WHEN Record_type = 'Claim' and Claim_Type_E0141 in ('C','H','M','F','I','N','K','Z') OR
                             Record_type = 'Encounter' and ENCOUNTER_TYPE_H054 in ('I')
                        THEN (CASE WHEN POS in ('21','22','23','24','25','26','27','28')
                                   THEN '31' 
                                   WHEN POS in ('86')
                                   THEN '32' 
                                   WHEN POS in ('81','82')
                                   THEN '34' 
                                   WHEN POS in ('61','62','63','64','65','66','67','68')
                                   THEN '54' 
                                   WHEN Record_type = 'Claim'
                                   ELSE BILL_TYPE_1_2_E0394
                              END)  
                        ELSE pos_new                
                   END);

SAS代码中没有
else
子句。但是,如果不满足任何条件,则
pos\u new
的值不变。您的版本将该值设置为
NULL
(如果该值是原始值,则可能没有什么区别)。

不知道任何SAS,但您的SQL似乎缺少外壳。应该是介于“SET POS_new=”和“WHEN”之间的情况。非常感谢您的帮助!我只是想找到一个可行的方法。但你的版本更简洁。非常感谢:D