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
我正在尝试为以下 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