【问题标题】:SQL language programming using decode in SELECT statement在 SELECT 语句中使用解码的 SQL 语言编程
【发布时间】:2017-04-26 23:47:54
【问题描述】:

我有两个参数,分别称为 START_DATE 和 END_DATE。

如果输入了开始日期和结束日期,我想使用 TO_CHAR 转换为不同的格式并以 'MON DD, YYYY' 格式显示 ":start_date - :end_date")

但是,如果未输入参数,我想使用 TO_CHAR 函数显示上个月的信息,即(2017 年 3 月 1 日-2017 年 3 月 31 日)。

这是下面的代码。有人可以识别我的错误并提供帮助吗?

SELECT DECODE (TO_CHAR(:START_DATE, 'MON DD, YYYY',(trunc(trunc(sysdate,'MONTH')-1,'MONTH'))),'MON DD, YYYY')
   || ' - ' || DECODE (TO_CHAR(:END_DATE, 'MON DD, YYYY',(trunc(sysdate,'MONTH')-1)'MON DD, YYYY') BILLPERIOD

我如何使用 decode 函数在 sql 中编写这个?

【问题讨论】:

  • 标记您正在使用的 dbms。您的查询中有许多特定于产品的功能。
  • 您使用什么风格的 SQL?用那个标记问题?
  • 我正在使用 Oracle SQL dbms。
  • 我又试了一次,这样更准确吗:SELECT DECODE (:START_DATE, NULL, TO_CHAR((trunc(trunc(sysdate,'MONTH')-1,'MONTH')),'MON DD , YYYY'), TO_CHAR (:START_DATE,'MON DD, YYYY'))|| ' - ' || DECODE (:END_DATE, NULL, TO_CHAR((trunc(sysdate,'MONTH')-1),'MON DD, YYYY'), TO_CHAR(:END_DATE,'MON DD, YYYY'))
  • @jarlh:你确定吗?我可能是错的,但我认为这个标准 SQL 例如用于连接的|| 运算符,用于参数的: 前缀等。唯一有问题的语法是sysdate(保留字),但我认为意图很明确。

标签: sql oracle decode


【解决方案1】:

我强烈建议您改用 CASE 语句。更多的控制,更易读,更干净等等。当然在我的拙见中。

SELECT 
  CASE 
    -- If one or both dates are NULL, revert to last month
    WHEN start_date IS NULL OR end_date IS NULL THEN
      to_char(trunc(trunc(sysdate,'MM')-1,'MM'), 'MON DD, YYYY') || ' - ' || to_char(trunc(sysdate,'MM')-1, 'MON DD, YYYY')
    WHEN start_date IS NOT NULL AND end_date IS NOT NULL AND
    (start_date < end_date) THEN
      to_char(start_date, 'MON DD, YYYY') || ' - ' || to_char(end_date, 'MON DD, YYYY')
    -- ** ALWAYS EXPECT THE UNEXPECTED!  **
    -- Like start_date >= end_date
    ELSE '**  DATE ERROR  **'
  END as billperiod
  FROM dual;

编辑:添加了一个检查 start_date 必须是

【讨论】:

    【解决方案2】:

    如果您可以在项目中使用CASE,请尝试:

    SELECT
      CASE START_DATE
        WHEN NULL THEN TO_CHAR(PREVIOUS_DATE, 'MON DD, YYYY')
        ELSE TO_CHAR(START_DATE, 'MON DD, YYYY')
        END || ','
      CASE END_DATE
        WHEN NULL THEN TO_CHAR(PREVIOUS_DATE, 'MON DD, YYYY')
        ELSE TO_CHAR(END_DATE, 'MON DD, YYYY')
        END "Formated Date"
    FROM BILLPERIOD;
    

    【讨论】:

    • 老实说,我对使用 CASE 不太满意。我现在更喜欢 DECODE,直到我了解更多关于 CASE 的信息
    • 这个解码是否有效:SELECT DECODE (:START_DATE, NULL, TO_CHAR((trunc(trunc(sysdate,'MONTH')-1,'MONTH')),'MON DD, YYYY') , TO_CHAR (:START_DATE,'MON DD, YYYY'))|| ' - ' || DECODE (:END_DATE, NULL, TO_CHAR((trunc(sysdate,'MONTH')-1),'MON DD, YYYY'), TO_CHAR(:END_DATE,'MON DD, YYYY'))
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2014-12-05
    • 2013-10-10
    • 1970-01-01
    • 2018-05-12
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多