有没有更优雅的方式来重复使用代码块?

彼得

我喜欢像下面这样写我的sql。

好处是我可以重复使用多次使用的代码块,并且当我修复某些东西时,我总是只需要在一个地方修复它。

例如,我写了2次current_year而不是extract(sys_date的年)

其他示例,我写了2次first_of_april_this_year而不是to_date('01 .APR。'|| current_year ||'00:00:00','DD.MON.YYYY HH24:MI:SS')

它可以工作,但是正如您在下面看到的那样,它不是很漂亮/不容易阅读。您是否有更好的建议,使我不会因不必在多个地方修复某些东西而使它更具可读性而受益匪浅?我也使用了从句,但是恕我直言,它的可读性更低。非常感谢你!<3

PS:让我们在这里继续讨论重用代码块的话题,而不要探讨如何更好地完成这项以可测试的方式查找4月1日的特定任务。TY!

-- gives the latest 1st of April based on sysdate, whereas for testing sysdate can freely be set     
select 
    case when sys_date <= first_of_april_this_year then first_of_april_last_year else first_of_april_this_year end previous_first_of_april
    -- ,params3.* 
from (    
    select 
        to_date ('01.APR.'|| current_year    ||' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_this_year,
        to_date ('01.APR.'||(current_year-1) ||' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_last_year,
        params2.*
    from (
        select 
            extract (year from sys_date) current_year,
            params1.* 
        from
        (select 
            to_date ('02.AUG.2018 00:00:01', 'DD.MON.YYYY HH24:MI:SS') sys_date  -- for testing, sysdate can be overwritten
            --sysdate sys_date 
        from dual) params1 
    ) params2 
) params3;
骨干主义者

您可以使用子查询因式分解(aka公共表表达式,aka CTE)使带有多个子查询的查询更易于阅读。例如,您的查询将变为:

WITH params1 AS (SELECT to_date('02.AUG.2018 00:00:01', 'DD.MON.YYYY HH24:MI:SS') sys_date -- for testing, sysdate can be overwritten
                 --sysdate sys_date 
                 FROM   dual),
     params2 AS (SELECT extract(YEAR FROM sys_date) current_year,
                        sys_date
                 FROM   params1),
     params3 AS (SELECT to_date('01.APR.' || current_year || ' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_this_year,
                        to_date('01.APR.' || (current_year - 1) || ' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_last_year,
                        sys_date
                 FROM   params2)
SELECT CASE
         WHEN sys_date <= first_of_april_this_year THEN
          first_of_april_last_year
         ELSE
          first_of_april_this_year
       END previous_first_of_april
FROM   params3;

顺便说一句,根据日期计算4月1日可以更简单地完成:

SELECT add_months(TRUNC(add_months(SYSDATE, -3), 'yyyy'), 3)
FROM   dual;

在这里,我们从指定的日期返回3个月,将结果日期截断到年份(直到该年的1月1日),然后再简单地加上3个月,将我们带到该年的4月1日。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有更优雅的方式?

有没有更优雅的方式来声明新的 var 并同时使用 global

有没有更优雅的方式来将else语句与独立的if()s一起使用

有没有更优雅的方式来启动基于列表的线程?

有没有更优雅的方式来执行这个 switch 语句?

有没有更好/更干净/更优雅的方式来分配和释放cuda?

有没有更优雅的方式来编码此生成器?

有没有更优雅的方式来读取CSV列并与记录ID合并?

有没有一种更优雅的方式来代替编写大量查询?

有没有更优雅的方式来编写这个 If/or 条件?

有没有更优雅的方式来写这些条件?

有没有更优雅的方式在 SwiftUI 中使用颜色文字?

有没有更优雅的方式来使用 AutoIt 获取 Internet Expolor 版本

有没有更优雅的方式在 R 中使用映射值?

有没有更紧凑/优雅的方式来编写此代码?

有没有一种优雅的方法来避免 Promise 的代码重复?

有没有更优雅的方法来折叠 dplyr 中的两行?

有没有更优雅的方法来检查表单默认值?

有没有更优雅的方法来查询多个OR和AND上的多对多表?

有没有更优雅的方法来检查freemarker中的变量?

有没有更优雅的解决方案来修改这些文件名?

有没有更优雅的方式在Kotlin中编写此吸气剂?

Ramda 拒绝 - 有没有更优雅的方式来写这个?

有没有更优雅的方式在C#中嵌套数组?

我重复了很多代码。有没有办法可以重复使用相同的代码而不必再次复制它?

有没有更优雅的子串方法?

有没有更短、更优雅的写法?

Vue.js-有没有更优雅的方法来有条件地应用类?

有没有更优雅的方法来编写带有重叠(嵌套)替代方案的语句?