您好我正在尝试从MySQL迁移到Oracle。到目前为止,在我遇到这个问题之前一直很好:
INSERT INTO waiting
(
dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn,
dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn,
dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn, dbcolumn
)
SELECT
(case NVL(max(dbcolumn))
when 0
then max(dbcolumn)+1
when 1
then 3 end),
(case NVL(max(dbcolumn))
when 0
then max(dbcolumn)+2
when 1
then 4 end),
"value" , "value" , "" , "value" , "value" ,
"value" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "value" , "" , "" , "value" , "value"
FROM waiting
WHERE dbcolumn < value;
空的值可以为null。
当我尝试运行查询时,它会给我:"missing right parenthesis"
但这似乎并不正确,因为我正在关闭所有括号。
有人能给我一个神奇的答案,为什么我会收到此错误消息?
提前致谢。
答案 0 :(得分:0)
NVL(max(dbcolumn),0)
代替NVL(max(dbcolumn))
请勿对CASE
使用括号:
SELECT case NVL(max(dbcolumn),0)
when 0
then max(dbcolumn)+1
when 1
then 3 end,
我不确定但是使用单引号'
而不是双引号"
。
答案 1 :(得分:0)
它应该是这样的
(case
WHEN NVL(max(dbcolumn), '0') = 0 THEN
max(dbcolumn1) + 1
when NVL(max(dbcolumn), '0') = 1 then
3
end)
在oracle中,您要匹配的值在when
之后。
答案 2 :(得分:0)
如果您修复两个格式错误的NVL,missing right parenthesis
错误将消失。但是,您可能没有注意到另一个考虑因素。如果(对于第一列)MAX返回null或0,则NVL返回0并且CASE返回1.如果NVL返回1,则CASE返回3.这似乎是您想要的。但是,如果NVL返回任何其他值,则CASE返回NULL。如果那也是你想要的,那你就没事了。如果您想要任何其他值,您必须在ELSE中提供它。
这是语句的SELECT部分,简化为三列,具有不同的名称,显示了一个示例:
SELECT CASE NVL( MAX( Col1 ), 0 )
WHEN 0 THEN 1 -- if A = 0 then A+1 = 1
WHEN 1 THEN 3
ELSE MAX( Col1 )
END AS NewCol1,
case NVL( MAX( Col2 ), 0 )
WHEN 0 THEN 2
WHEN 1 THEN 4
ELSE MAX( Col2 )
END AS NewCol2,
'value' as NewCol3
FROM waiting
WHERE col1 < Value;