Oracle 使用 MOD 命令在 INSERT 上设置 Y/N

Oracle using MOD command to set Y/N on INSERT

我正在尝试为以下 table 生成一些样本数据,见下文。

我有一些函数可以在日期范围内生成随机日期和时间戳,效果很好。

我想使用 MOD 命令将活动字段填充为 'Y' 或 'N'。我想将每一行设置为 active='Y' 除了我想要 active='N' 的每第 5 行,但我正在努力使语法正确并且会很感激一些帮助。

以下是我到目前为止的测试案例。预先感谢所有回答者和您的专业知识。


ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY  HH24:MI:SS.FF';

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

CREATE OR REPLACE FUNCTION random_date(
     p_from IN DATE,
     p_to   IN DATE
   ) RETURN DATE
   IS
   BEGIN
     RETURN p_from + DBMS_RANDOM.VALUE() * (p_to - p_from + 1);
   END random_date;
   /

CREATE OR REPLACE FUNCTION random_timestamp(
     p_from IN TIMESTAMP,
     p_to   IN TIMESTAMP
   ) RETURN TIMESTAMP
   IS
   BEGIN
     RETURN p_from + DBMS_RANDOM.VALUE() * (p_to - p_from + interval '1' day);
   END random_timestamp;
   /

CREATE TABLE t1 (
    seq_num NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
      dt   DATE,
      ts TIMESTAMP,
      active VARCHAR2(2)
   );

/*
Want every row active=Y
Except every 5th row=N
*/

INSERT INTO t1 (dt, ts, active)
           SELECT         random_date(DATE '2022-05-01', DATE '2022-05-31'),
               random_timestamp(DATE '2022-05-01', DATE '2022-05-31')
           FROM
               dual CONNECT BY level <= 1000;

使用decode()(或case),像这样:

decode(mod(rownum,5),0,'N','Y') as active

您可以使用 CASE 表达式:

INSERT INTO t1 (dt, ts, active)
SELECT random_date(DATE '2022-05-01', DATE '2022-05-31'),
       random_timestamp(DATE '2022-05-01', DATE '2022-05-31'),
       CASE MOD(LEVEL, 5)
       WHEN 0
       THEN 'N'
       ELSE 'Y'
       END
FROM   dual
CONNECT BY level <= 1000;

db<>fiddle here