Oracle Sql:Case When和Decode

时间:2014-04-28 22:36:21

标签: sql oracle

我收到此查询的错误“遗失关键字”。

此查询的目的是查找区域标识。示例:如果COLUMN1为'Lab',而COLUMN2为'Reg1',则创建一个名为CollectionZone的新列,其文本为'Zone1'。或者,如果COLUMN1为'Lab',COLUMN2为'Reg2',则创建一个名为CollectionZone的新列,其文本为'Zone2'。对于Reg3,Zone 3等,序列将继续。

我不确定为什么会出现错误消息。也许错误是因为我不知道如何结束Case语句。有关如何更改查询的任何想法?谢谢!

Select
Case When COLUMN1 In ('Lab') Then
Decode (COLUMN2, 'Reg1', 'Zone1', 'Reg2', 'Zone2', 'DefaultZone') CollectionZone
From Test_Table
;

4 个答案:

答案 0 :(得分:4)

END语句缺少CASE。文档和示例为here

Select
    Case 
        When COLUMN1 In ('Lab') 
        Then Decode(COLUMN2, 'Reg1', 'Zone1', 'Reg2', 'Zone2', 'DefaultZone') END CollectionZone
From Test_Table;

答案 1 :(得分:2)

首先,case语句需要end

CASE WHEN column1 = 'Lab'
     THEN DECODE( column2, 'Reg1', 'Zone1', 'Reg2', 'Zone2', 'DefaultZone')
 END CollectionZone

但我强烈怀疑你错过了ELSE中的CASE。如果column1不是Lab,则您的查询将返回NULL。这真的是你想要的吗?或者你真的想要'DefaultZone'吗?

从实际的角度来看,我很难想象为什么你要同时使用CASEDECODE。使用其中一种似乎更有意义。

CASE WHEN column1 = 'Lab'
     THEN CASE column2
               WHEN 'Reg1' THEN 'Zone1' 
               WHEN 'Reg2' THEN 'Zone2'
               ELSE 'DefaultZone'
           END
 END CollectionZone

当然,如果你这些是实际值而不仅仅是例子,你真的想做一些字符串操作来从你的Column2值中取出数字并用它来构造您的Zone值。

答案 2 :(得分:2)

我支持使用case而不使用decode()case是ANSI标准,功能更强大。您可以在以下一个案例中执行此操作:

Select (Case When COLUMN1 In ('Lab') and COLUMN2 = 'Reg1' THEN 'Zone1'
             When COLUMN1 In ('Lab') and COLUMN2 = 'Reg2' THEN 'Zone2'
             When COLUMN1 In ('Lab') and COLUMN2 = 'Reg3' THEN 'Zone3'
             ELSE 'DefaultZone'
        end) as CollectionZone
From Test_Table;

请注意,这与您的版本略有不同,因为结果永远不会是NULL

答案 3 :(得分:0)

SELECT 
(CASE WHEN COLUMN1 = 'Lab' AND COLUMN2 = 'Reg1' THEN 'Zone1'
      WHEN COLUMN1 = 'Lab' AND COLUMN2 = 'Reg2' THEN 'Zone2'
      WHEN COLUMN1 = 'Lab' AND COLUMN2 = 'Reg3' THEN 'Zone3'
      --Continue till the combination you want    
      ELSE NULL END) as CollectionZone

      from TestTable