我有一个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/sql
和PL/SQL Developer
都是v10。
想要的结果如下:
col1 | col2 | col3
------|-------|------
abc | 1.23 | text
abc | 12.34 | text
abc | 123.45| text
... | ... | ...
答案 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 ...;
答案 1 :(得分:0)
您还没有告诉我们是否要按特定的顺序将行视为1,2,3 ..如果确实存在命令,那么Value
是不可靠的,可能无法正常工作,您将需要ROWNUM
并按列指定特定顺序。可以将其与row_number()
语句组合。
MERGE