2014-04-28 47 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的回答有什麼不同? –