在 Oracle 中使用 Case 表达式进行条件日期比较和赋值 SQL
Conditional Date Comparison and Assignment using Case expression in Oracle SQL
我是该网站的新手 SQL。我需要 case 表达式方面的帮助。
要求如下:
我有一个带有两个日期列的 table T1 - eff 和 disc;
第二个 table T2 有 2 个日期列 - on_date & off_date;
我正在尝试构建一个单一的 case 表达式,我可以在其中比较 table 的日期列,并根据特定条件分配值。
条件是:
• 如果 T1.eff 和 T2.disc 日期设置为默认日期,即 T1.eff=1/1/1970 和 T2.disc=1970
Then set set T1.eff=T2.on_date and T2.disc=T2.off_date
• 如果 T1.eff >T2.on_date 且 T1.disc >T2.off_date
Then set T1.disc=T2.Off_date.
• 如果T1.eff
Then set T1.eff=T2.On_date.
• 如果T1.eff T2.off_date
Then set T1.eff=T2.On_date and T1.disc=T2.Off_date
• 如果 T1.eff >T2.on_date 且 T1.disc
Then do not update eff, disc dates, insert as is.
我开始写一个 Case 表达式,但我对如何 build/write 块感到困惑;我需要将 'eff' 和 'disc' 日期作为一个条件进行比较,然后在单个 case 表达式中将各自的值分配给 'eff' 和 'disc'。
SELECT
CASE T1.EFF, T1.DISC
WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')
THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF > T2.ON_DATE AND T1.DISC > T2.OFF_DATE
THEN T1.EFF = T1.EFF AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE
THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE
THEN T1.EFF = T1.EFF AND T1.DISC - T1.DISC
END,
T2.ON_DATE, T2.OFF_DATE
FROM T2, T1
WHERE T1.A = T2.B
等等
我不确定我们是否可以 get/use 在单个 case 表达式中包含两列。
Oracle DB - 客户端版本:12.1.0.2.0
提前致谢! => VPPG
我想您想要的是修改 SELECT 输出中显示的 EFF
和 DISC
的值。您不能使用单个 case 语句轻松地做到这一点,因为您想要更改 2 列的输出。但是如果你简化你的逻辑,你仍然可以保持它非常简单。
SELECT
CASE WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')
THEN T2.ON_DATE
WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE
THEN T2.ON_DATE
ELSE T1.EFF
END as EFF,
CASE WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE
THEN T1.DISC
ELSE T2.OFF_DATE
END as DISC,
T2.ON_DATE, T2.OFF_DATE
FROM T2, T1
WHERE T1.A = T2.B;
另请注意,我使用的是 CASE
表达式的不同形式 - 有两种使用方法。
如果这不能真正解决您的问题,请告诉我,我会更新我的答案。
我是该网站的新手 SQL。我需要 case 表达式方面的帮助。
要求如下:
我有一个带有两个日期列的 table T1 - eff 和 disc;
第二个 table T2 有 2 个日期列 - on_date & off_date;
我正在尝试构建一个单一的 case 表达式,我可以在其中比较 table 的日期列,并根据特定条件分配值。
条件是:
• 如果 T1.eff 和 T2.disc 日期设置为默认日期,即 T1.eff=1/1/1970 和 T2.disc=1970
Then set set T1.eff=T2.on_date and T2.disc=T2.off_date
• 如果 T1.eff >T2.on_date 且 T1.disc >T2.off_date
Then set T1.disc=T2.Off_date.
• 如果T1.eff
Then set T1.eff=T2.On_date.
• 如果T1.eff T2.off_date
Then set T1.eff=T2.On_date and T1.disc=T2.Off_date
• 如果 T1.eff >T2.on_date 且 T1.disc
Then do not update eff, disc dates, insert as is.
我开始写一个 Case 表达式,但我对如何 build/write 块感到困惑;我需要将 'eff' 和 'disc' 日期作为一个条件进行比较,然后在单个 case 表达式中将各自的值分配给 'eff' 和 'disc'。
SELECT
CASE T1.EFF, T1.DISC
WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')
THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF > T2.ON_DATE AND T1.DISC > T2.OFF_DATE
THEN T1.EFF = T1.EFF AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE
THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE
WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE
THEN T1.EFF = T1.EFF AND T1.DISC - T1.DISC
END,
T2.ON_DATE, T2.OFF_DATE
FROM T2, T1
WHERE T1.A = T2.B
等等
我不确定我们是否可以 get/use 在单个 case 表达式中包含两列。
Oracle DB - 客户端版本:12.1.0.2.0
提前致谢! => VPPG
我想您想要的是修改 SELECT 输出中显示的 EFF
和 DISC
的值。您不能使用单个 case 语句轻松地做到这一点,因为您想要更改 2 列的输出。但是如果你简化你的逻辑,你仍然可以保持它非常简单。
SELECT
CASE WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')
THEN T2.ON_DATE
WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE
THEN T2.ON_DATE
ELSE T1.EFF
END as EFF,
CASE WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE
THEN T1.DISC
ELSE T2.OFF_DATE
END as DISC,
T2.ON_DATE, T2.OFF_DATE
FROM T2, T1
WHERE T1.A = T2.B;
另请注意,我使用的是 CASE
表达式的不同形式 - 有两种使用方法。
如果这不能真正解决您的问题,请告诉我,我会更新我的答案。