2014-04-28 80 views
0

我收到此查询错误“缺少关键字”。Oracle Sql:案例时和解码

此查询的目的是查找区域名称。例如:如果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

你们是CASE语句中缺少END。文档和示例是here

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

首先,case语句需要一个end

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

我强烈怀疑,虽然,你少在CASEELSE。如果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

我是使用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

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 
+0

这和Gordon的回答有什么不同? –