如何将特定列值更新为特定 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' 上过滤,而对于该行 eligibleNULL.


更新

需求沟通不畅,但您现在似乎要求更新 eligibleYassigned_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;`