下面的代码使用 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 格式比较日期值;您需要将ODUDATODCDAT 转换为日期类型,然后进行比较。

最佳解决方案,构建或下载(我推荐 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 为空时不会删除行的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3删除导航栏下面的行

几次迭代后访问 VBA 宏卡住

用于在编译时删除未使用的命令行工具或 dotnet 工具

删除行 UITableView 索引问题

如何删除 NA 值和上面和下面的行

r - 如果下面的行包含一个值,则从计数中删除