如果 Oracle 中存在行值,则使用随机值更新行

Posted

技术标签:

【中文标题】如果 Oracle 中存在行值,则使用随机值更新行【英文标题】:Update rows with random value if row value is exist in Oracle 【发布时间】:2016-04-15 09:02:45 【问题描述】:

我自己是 Oracle 和 SQL 的新手,

我开发了一个 SQL 命令来通过随机值更新列,它运行良好,除了它正在更新列中每一行的随机值,如果值存在,我想更新行。我已经用 2 种不同的方式尝试了我的命令,但结果仍然相同,我的命令看起来像这样

--类型 1

UPDATE my_schema.table
SET  col1 =DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(8, 10)),
   Col2= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(1, 28)),
   Col3= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(1, 28)),
   Col4= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(1, 2));

--type2

UPDATE my_schema.table
SET col1= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(8, 10)) where col1 IS NOT NULL,    col2= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(10, 15)) where col2 IS NOT NULL,    col3= DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(8, 10)) where col4 IS NOT NULL;

两个命令都更新列的所有行,我必须更新表中的 15 列 有人可以帮助我如何编写更高效的 PL/SQL 过程

提前谢谢你

【问题讨论】:

【参考方案1】:

您可以使用CASE 检查每列的值,并仅在符合您的条件时更新它:

update yourTable
set col1 = case
             when col1 is not null
              then DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(1, 28))
             else null
           end,
    col2 = case
             when col2 is not null
              then DBMS_RANDOM.STRING('A', DBMS_RANDOM.VALUE(1, 28))
             else null
           end
...    

【讨论】:

您好,感谢您的回复,但它仍在更新所有行。【参考方案2】:

由于缺少WHERE 子句,所有行都在更新。您可以在下面尝试并根据需要将 WHERE 子句条件从 OR 翻转到 AND。让我知道它是否有效。谢谢!

UPDATE myschema.table
   SET col1 = DBMS_RANDOM.STRING ('A', DBMS_RANDOM.VALUE (8, 10)),
       Col2 = DBMS_RANDOM.STRING ('A', DBMS_RANDOM.VALUE (1, 28)),
       Col3 = DBMS_RANDOM.STRING ('A', DBMS_RANDOM.VALUE (1, 28)),
       Col4 = DBMS_RANDOM.STRING ('A', DBMS_RANDOM.VALUE (1, 2))
 WHERE    col1 IS NOT NULL
       OR col2 IS NOT NULL
       OR col3 IS NOT NULL
       OR col4 IS NOT NULL;

【讨论】:

Dwiwedi :检查我的第二个查询,它没有效果:( @DBA_ORACLE:您的第二个查询需要更正,您不能有这样的WHERE 子句。它是您SET 之外的谓词。试一次,让我知道几条记录。我已经尝试过设置一些空值等。如果有帮助,请告诉我。 @Dwivedi ;我在单个列上进行了测试,但没有效果:( ...请问如何在此查询上应用 COALESCE 或 NVL 函数。 插入 4 行后,我将 col 值设置为 NULL,然后运行 ​​UPDATE。只更新了一行。也尝试过其他组合。或者,您可以为这 4 列编写 4 个不同的 UPDATE。可以分享您的查询,让我看看您尝试了什么。

以上是关于如果 Oracle 中存在行值,则使用随机值更新行的主要内容,如果未能解决你的问题,请参考以下文章

在oracle中将行值添加到列

使用上一个行值更新行号

Rails 3.x 如何根据行值编写全部更新?

Oracle:更新旧行时创建新行

MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

PYSPARK:根据条件用另一个行值更新一行中的值?