我有一张桌子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。但是,使用select mod(rownum,10) as lastDig from tab1查询,我得到了每个行号的正确最后数字。但是,我不明白如何将这个select的结果用于我的update when条件。
请您提供一个在这种情况下执行此任务的查询示例。是否需要在临时表中使用子查询或select?请解释一下。我是一个初级的前卫,但我需要这样创建一个演示表。我相信,pl/sql是v10,PL/SQL Developer也是。
想要的结果如下:
col1 | col2 | col3
------|-------|------
abc | 1.23 | text
abc | 12.34 | text
abc | 123.45| text
... | ... | ... 发布于 2018-06-20 12:59:32
您可以使用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 ...;发布于 2018-06-20 13:13:29
您还没有告诉我们,是否有特定的顺序要将行视为1,2,3。如果确实有订单,那么ROWNUM是不可靠的,可能无法工作,您将需要一列一列具有特定订单的row_number()。它可以与MERGE语句结合使用。
MERGE INTO tab1 tgt USING (
SELECT
CASE mod( ROW_NUMBER() OVER(
ORDER BY
col1 -- the column which is in order and unique
),10)
WHEN 1 THEN 1.23
WHEN 2 THEN 12.34
WHEN 3 THEN 123.45
--..
--.. 9
ELSE col2
AS col2
FROM
tab1 t
)
src ON ( tgt.rowid = src.rowid ) --use primary key/unique key if there is one instead of rowid
WHEN MATCHED THEN UPDATE SET tgt.col2 = src.col2;演示
https://stackoverflow.com/questions/50948778
复制相似问题