下面的代码使用 ODUDAT 删除行,但在 ODUDAT 为空时不会删除行
Posted
技术标签:
【中文标题】下面的代码使用 ODUDAT 删除行,但在 ODUDAT 为空时不会删除行【英文标题】:The code below deletes rows utilizing ODUDAT but it does not delete rows when ODUDAT is Empty 【发布时间】:2021-05-19 15:05:47 【问题描述】:DELETE FROM HERAPERM.SCRUBLITST WHERE COALESCE(ODUDAT, ODCDAT,
CASE
WHEN ODUDAT <> ' ' THEN SUBSTR(ODUDAT, 1, 2) || SUBSTR(ODUDAT, 3, 2) || SUBSTR(ODUDAT, 5, 2)
ELSE SUBSTR(ODCDAT, 1, 2) || SUBSTR(ODCDAT, 3, 2) || SUBSTR(ODCDAT, 5, 2)
END) > TO_CHAR(CURRENT_DATE - 2 MONTHS, 'MMDDYY');
ODUDAT 最后一次使用。第二个日期是 ODCDAT,它是创建日期。数据格式为 MMDDYY。我需要删除上次使用日期超过两个月的行。如果文件是在过去两个月内创建但未使用,则需要将其保留在文件中。该文件包含 6893 行。当我使用上述内容时,我得到 553 行。它从 ODUDAT 中删除旧项目,但不触及 ODCDAT。我不知道为什么它忽略了 ODCDAT。 样本数据
A210407001 *FILE DDMF 040821 BYOD_00003 *FILE PF 021521 021621 DPI2194LO1 *FILE LF 041221 DPI2194LO2 *FILE LF 041221 DSLAMPORT1 *FILE PF 021521 021521 FIXPHYADR1 *FILE LF 042021 –
【问题讨论】:
和这里一样吗? ***.com/questions/67603860/… 不..我添加了案例。我试图弄清楚如何删除另一个,但可以看到但没有回答,所以不知道该怎么做。另外,一个帮助我的人给了我信息以便更好地提交,以免造成混淆。 【参考方案1】:COALESCE()
在处理 NULL 值时起作用..
空的 VARCAR() 或 CHAR 空格字符串在 Db2 中不是 NULL。
您也不能使用字符 MMDDYY 格式比较日期值;您需要将ODUDAT
、ODCDAT
转换为日期类型,然后进行比较。
最佳解决方案,构建或下载(我推荐 iDate)一个用户定义函数 (UDF),它将转换数字/字符日期。
那么你就可以了
DELETE FROM HERAPERM.SCRUBLITST
WHERE COALESCE(iDate(ODUDAT,'*MMDDYY')
, iDate(ODCDAT,'*MMDDYY')
, current_date)
> CURRENT_DATE - 2 ;
【讨论】:
当 sbusr 不在代码中时,它会返回错误 加法的操作数是时间戳,另一个不是持续时间。日期没有 NULL 它们是空的。我只是不知所措。我没有尝试过。 再次构建一个 UDF(或下载 iDate),当字符值不是有效日期时返回 NULL。以上是关于下面的代码使用 ODUDAT 删除行,但在 ODUDAT 为空时不会删除行的主要内容,如果未能解决你的问题,请参考以下文章