在mod(rownum,10)= number上更新表的所有行中的列值

时间:2018-06-20 12:55:16

标签: sql oracle

我有一个tab1表,如下所示:

 col1 | col2 | col3
------|------|------
 abc  | 100  | text
 abc  | 100  | text
 abc  | 100  | text
 ...  | ...  | ... 

我需要像这样更新每行中的col2值:

update tab1 
    set col2 = 1,23
    when mod(rownum,10) = 1; 
update tab1 
    set col2 = 12,34
    when mod(rownum,10) = 2;
update tab1 
    set col2 = 123,45
    when mod(rownum,10) = 3;

等,直到when mod(rownum,10) = 9

但是显然该查询不起作用,原因是在这种情况下rownum总是返回1,即afaik。但是,通过select mod(rownum,10) as lastDig from tab1查询,我得到了每个行号的正确最后数字。但是我不明白如何将select的结果用于我的update when条件。

请提供一个在这种情况下可以完成工作的查询示例吗?我是否需要在临时表中使用子查询或select?请解释。我是一个初级的前端人员,但是我需要以这种方式创建一个演示表。我相信pl/sqlPL/SQL Developer都是v10。

想要的结果如下:

 col1 | col2  | col3
------|-------|------
 abc  | 1.23  | text
 abc  | 12.34 | text
 abc  | 123.45| text
 ...  | ...   | ... 

2 个答案:

答案 0 :(得分:1)

您可以使用CASE表达式或DECODE

update tab1 
set col2 =  CASE mod(rownum,10) WHEN 1 THEN 1.23
                                WHEN 2 THEN 12.34
                                WHEN 3 THEN 123.45
                                -- ...
                                ELSE col2
            END
-- WHERE ...

UPDATE tab1
SET col2 = DECODE(mod(rownum,10), 1, 1.23, 2, 12.34, 3, 123.45, ..., col2)
-- WHERE ...;

DBFiddle Demo

答案 1 :(得分:0)

您还没有告诉我们是否要按特定的顺序将行视为1,2,3 ..如果确实存在命令,那么Value是不可靠的,可能无法正常工作,您将需要ROWNUM并按列指定特定顺序。可以将其与row_number()语句组合。

MERGE

Demo