首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mod(rownum,10) = number上的表的所有行中更新列值

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

Stack Overflow用户
提问于 2018-06-20 12:55:16
回答 2查看 759关注 0票数 2

我有一张桌子tab1,看起来像这样:

代码语言:javascript
复制
 col1 | col2 | col3
------|------|------
 abc  | 100  | text
 abc  | 100  | text
 abc  | 100  | text
 ...  | ...  | ... 

我需要更新每一行中的col2值,如下所示:

代码语言:javascript
复制
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也是。

想要的结果如下:

代码语言:javascript
复制
 col1 | col2  | col3
------|-------|------
 abc  | 1.23  | text
 abc  | 12.34 | text
 abc  | 123.45| text
 ...  | ...   | ... 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 12:59:32

您可以使用CASE表达式或DECODE

代码语言:javascript
复制
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演示

票数 1
EN

Stack Overflow用户

发布于 2018-06-20 13:13:29

您还没有告诉我们,是否有特定的顺序要将行视为1,2,3。如果确实有订单,那么ROWNUM是不可靠的,可能无法工作,您将需要一列一列具有特定订单的row_number()。它可以与MERGE语句结合使用。

代码语言:javascript
复制
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;

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50948778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档