我有一个典型的要求,即根据同一表中其他列中指定为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
答案 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;