我收到此查询的错误“遗失关键字”。
此查询的目的是查找区域标识。示例:如果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
;
答案 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'
吗?
从实际的角度来看,我很难想象为什么你要同时使用CASE
和DECODE
。使用其中一种似乎更有意义。
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