如何将特定列值更新为特定 ID 的今天日期并将其他值保持为前一个日期
How to update particular column value to today's date for the particular ID and keeping other value as previous date
CREATE TABLE e_tab (
e_id NUMBER(10),
eligible VARCHAR2(30),
assigned_date TIMESTAMP
);
INSERT INTO e_tab VALUES(1,'Y',null);
INSERT INTO e_tab VALUES(2,'Y',null);
INSERT INTO e_tab VALUES(3,null,null);
SET SERVEROUTPUT ON;
DECLARE
lv_flag NUMBER(10);
BEGIN
SELECT
COUNT(1)
INTO lv_flag
FROM
e_tab
WHERE
assigned_date != sysdate;
IF lv_flag < 1 THEN
UPDATE e_tab
SET
assigned_date = current_timestamp
WHERE
eligible = 'Y';
END IF;
COMMIT;
END;
我有一个 table e_tab
需要根据 eligible
列进行更新。如果 eligible
列是 Y
,那么我需要将 assigned_date
列更新为 current date
,这不会经常发生。说 2 E_ID 是 1 和 2 eligible
列是 Y
所以我已经将 assigned_date
列更新到今天的日期但是对于第三个 e_id
即 3将在一天后更新,并将 eligible
列更新为 Y。然后,在这种情况下,它应该只将第三个 e_id 更新为明天的日期,而前一个将保持原样。
预期输出:
+------+----------+-------------------------------+
| E_ID | ELIGIBLE | ASSIGNED_DATE |
+------+----------+-------------------------------+
| 1 | Y | 02-02-22 3:53:46.449000000 PM |
| 2 | Y | 02-02-22 3:53:46.449000000 PM |
| 3 | Y | 03-02-22 3:53:46.449000000 AM |
+------+----------+-------------------------------+
我的代码适用于这种情况吗?而且如果稍后添加了更多 e_id
那么所有 e_id
也会发生同样的情况
您似乎不需要 PL/SQL,可以使用简单的 SQL 语句:
UPDATE e_tab
SET eligible = 'Y',
assigned_date = CASE eligible
WHEN 'Y'
THEN current_date
ELSE current_date + INTERVAL '1' DAY
END
WHERE assigned_date IS NULL;
如果要更新所有行,请删除 WHERE
子句。
Will my code work for this scenario?
不,因为您的 UPDATE
语句永远不会更新第三行,因为它在 WHERE eligible = 'Y'
上过滤,而对于该行 eligible
是 NULL
.
更新
需求沟通不畅,但您现在似乎要求更新 eligible
为 Y
且 assigned_date
没有值的行。为此,您可以使用:
UPDATE e_tab
SET assigned_date = current_date
WHERE assigned_date IS NULL
AND eligible = 'Y';
稍后(即明天),您必须将第三行更改为 eligible = 'Y'
然后,如果您希望它成为一个单独的过程,可以 运行再次更新声明。
db<>fiddle here
您可以在 e_tab 上创建一个触发器,这样只要符合条件的列值设置为 'Y'.
,就会设置 assignment_date
CREATE OR REPLACE TRIGGER e_tab_biu
before insert or update
on e_tab
for each row
begin
IF :NEW.eligible = 'Y' AND NVL(:OLD.eligible,'N') != :NEW.eligible THEN
:NEW.assigned_date := current_timestamp;
END IF;
end e_tab_biu;
/
`UPDATE e_tab
SET eligible = 'Y',
assigned_date = CASE
WHEN eligible = 'Y'
THEN sysdate
ELSE sysdate + INTERVAL '1' DAY
END
WHERE assigned_date IS NULL;`
CREATE TABLE e_tab (
e_id NUMBER(10),
eligible VARCHAR2(30),
assigned_date TIMESTAMP
);
INSERT INTO e_tab VALUES(1,'Y',null);
INSERT INTO e_tab VALUES(2,'Y',null);
INSERT INTO e_tab VALUES(3,null,null);
SET SERVEROUTPUT ON;
DECLARE
lv_flag NUMBER(10);
BEGIN
SELECT
COUNT(1)
INTO lv_flag
FROM
e_tab
WHERE
assigned_date != sysdate;
IF lv_flag < 1 THEN
UPDATE e_tab
SET
assigned_date = current_timestamp
WHERE
eligible = 'Y';
END IF;
COMMIT;
END;
我有一个 table e_tab
需要根据 eligible
列进行更新。如果 eligible
列是 Y
,那么我需要将 assigned_date
列更新为 current date
,这不会经常发生。说 2 E_ID 是 1 和 2 eligible
列是 Y
所以我已经将 assigned_date
列更新到今天的日期但是对于第三个 e_id
即 3将在一天后更新,并将 eligible
列更新为 Y。然后,在这种情况下,它应该只将第三个 e_id 更新为明天的日期,而前一个将保持原样。
预期输出:
+------+----------+-------------------------------+
| E_ID | ELIGIBLE | ASSIGNED_DATE |
+------+----------+-------------------------------+
| 1 | Y | 02-02-22 3:53:46.449000000 PM |
| 2 | Y | 02-02-22 3:53:46.449000000 PM |
| 3 | Y | 03-02-22 3:53:46.449000000 AM |
+------+----------+-------------------------------+
我的代码适用于这种情况吗?而且如果稍后添加了更多 e_id
那么所有 e_id
您似乎不需要 PL/SQL,可以使用简单的 SQL 语句:
UPDATE e_tab
SET eligible = 'Y',
assigned_date = CASE eligible
WHEN 'Y'
THEN current_date
ELSE current_date + INTERVAL '1' DAY
END
WHERE assigned_date IS NULL;
如果要更新所有行,请删除 WHERE
子句。
Will my code work for this scenario?
不,因为您的 UPDATE
语句永远不会更新第三行,因为它在 WHERE eligible = 'Y'
上过滤,而对于该行 eligible
是 NULL
.
更新
需求沟通不畅,但您现在似乎要求更新 eligible
为 Y
且 assigned_date
没有值的行。为此,您可以使用:
UPDATE e_tab
SET assigned_date = current_date
WHERE assigned_date IS NULL
AND eligible = 'Y';
稍后(即明天),您必须将第三行更改为 eligible = 'Y'
然后,如果您希望它成为一个单独的过程,可以 运行再次更新声明。
db<>fiddle here
您可以在 e_tab 上创建一个触发器,这样只要符合条件的列值设置为 'Y'.
,就会设置assignment_date
CREATE OR REPLACE TRIGGER e_tab_biu
before insert or update
on e_tab
for each row
begin
IF :NEW.eligible = 'Y' AND NVL(:OLD.eligible,'N') != :NEW.eligible THEN
:NEW.assigned_date := current_timestamp;
END IF;
end e_tab_biu;
/
`UPDATE e_tab
SET eligible = 'Y',
assigned_date = CASE
WHEN eligible = 'Y'
THEN sysdate
ELSE sysdate + INTERVAL '1' DAY
END
WHERE assigned_date IS NULL;`