Oracle使用2个选择案例插入查询

时间:2014-05-28 09:46:23

标签: mysql sql oracle

您好我正在尝试从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" 但这似乎并不正确,因为我正在关闭所有括号。

有人能给我一个神奇的答案,为什么我会收到此错误消息?

提前致谢。

3 个答案:

答案 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;