根据其他列条件更新列

时间:2017-08-30 04:13:48

标签: sql oracle

我有一个典型的要求,即根据同一表中其他列中指定为min和max的边界值来验证Column值[Target]。

目前,我正在分两步进行验证,并确保目标列值位于边界限制范围内。可以使用单个Update语句完成吗?

以下是测试数据集:

CREATE TABLE rr_test
(
    minlimit INTEGER,
    maxlimit INTEGER,
    actualval INTEGER,
    calcval INTEGER
);

INSERT INTO rr_test
     VALUES (0,
             1000,
             500,
             NULL);

INSERT INTO rr_test
     VALUES (0,
             1000,
             2000,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             0,
             50,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             0,
             4000,
             NULL);

INSERT INTO rr_test
     VALUES (0,
             2000,
             50,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             4000,
             5000,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             4000,
             1000,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             4000,
             2000,
             NULL);

INSERT INTO rr_test
     VALUES (2000,
             4000,
             4000,
             NULL);

--To compare final results
UPDATE rr_test
   SET calcval = actualval;

此时的数据集:

MINLIMIT    MAXLIMIT    ACTUALVAL     CALCVAL
0           1000            500         500
0           1000            2000        2000
2000        0               50          50
2000        0               4000        4000
0           2000            50          50
2000        4000            5000        5000
2000        4000            1000        1000
2000        4000            2000        2000
2000        4000            4000        4000 

--Update Target with Max Boundary
UPDATE rr_test
   SET calcval = maxlimit
 WHERE actualval > maxlimit;

--Update Target with Min Boundary
UPDATE rr_test
   SET calcval = minlimit
 WHERE calcval < minlimit;

最终数据集:

MINLIMIT    MAXLIMIT    ACTUALVAL     CALCVAL
  0           1000        500           500
  0           1000        2000          1000
  2000        0           50            2000
  2000        0           4000          2000
  0           2000        50            50
  2000        4000        5000          4000
  2000        4000        1000          2000
  2000        4000        2000          2000
  2000        4000        4000          4000

3 个答案:

答案 0 :(得分:0)

你尝试过这样的事吗?

UPDATE rr_test
   SET actualval =
        CASE
            WHEN actualval < minlimit THEN minlimit
            WHEN actualval > maxlimit THEN maxlimit
            ELSE actualval
        END;

答案 1 :(得分:0)

使用CASE表达式:

UPDATE rr_test
SET calcval = CASE WHEN actualval > maxlimit THEN maxlimit
                   WHEN actualval < minlimit THEN minlimit END
WHERE
    actualval > maxlimit OR
    actualval < minlimit

我认为这会重现原始两个更新的逻辑。如果第一次更新发生,那么第二次更新将永远不会发生。第二次更新只有在第一次更新时才会发生。上面的CASE表达式具有相同的行为,因为每次更新只会出现条件。

编辑 - 如果两个条件都在同一行上触发:

UPDATE rr_test
SET calcval = CASE WHEN actualval < minlimit THEN minlimit 
                   WHEN actualval > maxlimit THEN maxlimit END
WHERE
    actualval > maxlimit OR
    actualval < minlimit

答案 2 :(得分:0)

我认为我在Single语句中发现了这样的情况,上面的查询中提示了所有Min和Max限制的情况:

UPDATE rr_test
   SET actualval =
           CASE
               WHEN maxlimit > minlimit
               THEN
                   CASE
                       WHEN actualval > maxlimit THEN maxlimit
                       WHEN actualval < minlimit THEN minlimit
                       ELSE actualval
                   END
               WHEN maxlimit < minlimit
               THEN
                   minlimit
               WHEN maxlimit = minlimit
               THEN
                   CASE
                       WHEN actualval > maxlimit THEN maxlimit
                       WHEN actualval < maxlimit THEN minlimit
                       ELSE actualval
                   END
           END;