【问题标题】:Querying where condition on as 'something' in oracle db在 oracle db 中查询 where 条件为“某事”
【发布时间】:2020-11-04 05:20:45
【问题描述】:

这是我的查询

SELECT to_char((CASE
            WHEN a.GATE_REL_DATE is not null THEN a.GATE_REL_DATE
            WHEN a.GATE_REL_DATE is null THEN (add_months(a.ORDER_DATE, 'YYYYMM') + 3)
            ELSE a.GATE_REL_DATE end), 'YYYYMM')  AS assumed_arrival_month,
       a.dealer,
       to_char(a.DLR_DELIVERY_DATE, 'YYYYMM') AS DLR_DELIVERY_DATE,
       to_char(a.ORDER_DATE, 'YYYYMM')        AS ORDER_DATE
from seereur.seer_arcentity a,
     seereur.seer_dropdowns b
where a.market_code IN ('UB') 
  and a.MODEL IN ('00O')
  and a.DLR_DELIVERY_DATE is null
  and a.pest = b.code
  and dropdown = 'PEST'
  and b.market_code IN ('UB')

这是我的结果

enter image description here

现在我想在某个月份(例如过去 5 个月)之间获取假设的到达月份(目前它给出了所有月份),但由于 assumed_arrival_month 位于所选区域中,因此无法在 where 条件之后放置和条件.如何实现?

【问题讨论】:

  • 我没有阅读第一行代码(所以:我什至没有阅读你的问题)。在顶部的 CASE 表达式中,当日期不为空时,您有一个 WHEN 子句,当同一日期为空时,还有另一个 WHEN 子句,然后还有 ELSE。 ELSE 有什么用?日期要么不为空,要么为空;两个 WHEN 子句之一将始终为真,因此您永远不会到达 ELSE 分支。请解释一下这是怎么回事。
  • 好的 - 现在我看到了这个问题。这是一个常见的问题。您不能在同一查询的 WHERE 子句中使用在 SELECT 子句中创建的名称。你有两个选择:一个是把它变成一个子查询,然后选择“从中” WHERE ....(并在外部查询中使用这里的名称);或者,在 WHERE 子句中从 SELECT 重复相同的长表达式。第二个选项不会为查询创建更多工作(表达式只计算一次并使用两次,用于 WHERE 和 SELECT),但代码更难看。第一个选项(更好)(........下面继续)
  • 第一个选项(更好)也不会产生额外的工作,因为优化器将重写查询,消除额外的层 - 本质上优化器将根据第二个选项重写查询我给了你”无论如何。你不需要看到“丑陋的代码”,即使这正是优化器会做的事情。

标签: sql oracle


【解决方案1】:

您可以将现有查询转换为子查询,然后从该集合中只选择您想要的值。在下面的示例中,我使用 11 月 1 日作为示例日期,但您可以更改它。另外,我调整了您用来确定 assumed_arrival_month 的逻辑,因为不需要 CASE 语句,而且您提供的语句无论如何都是无效的。

SELECT TO_CHAR (assumed_arrival_month, 'YYYYMM')     AS assumed_arrival_month,
       dealer,
       TO_CHAR (dlr_deliver_date, 'YYYYMM')          AS dlr_deliver_date,
       TO_CHAR (order_date, 'YYYYMM')                AS order_date
  FROM (SELECT NVL (a.GATE_REL_DATE, ADD_MONTHS (a.ORDER_DATE, 3))     AS assumed_arrival_month,
               a.dealer,
               a.DLR_DELIVERY_DATE,
               a.ORDER_DATE
          FROM seereur.seer_arcentity a, seereur.seer_dropdowns b
         WHERE     a.market_code IN ('UB')
               AND a.MODEL IN ('00O')
               AND a.DLR_DELIVERY_DATE IS NULL
               AND a.pest = b.code
               AND dropdown = 'PEST'
               AND b.market_code IN ('UB'))
 WHERE assumed_arrival_month BETWEEN DATE '2020-11-01'
                                 AND ADD_MONTHS (TRUNC (DATE '2020-11-01'), -5);

【讨论】:

    【解决方案2】:

    由于您的问题是只需要最后 5 个月,请尝试以下代码:

    SELECT TO_CHAR (assumed_arrival_month, 'YYYYMM')     AS assumed_arrival_month,
           dealer,
           TO_CHAR (dlr_deliver_date, 'YYYYMM')          AS dlr_deliver_date,
           TO_CHAR (order_date, 'YYYYMM')                AS order_date
      FROM (SELECT NVL (a.GATE_REL_DATE, ADD_MONTHS (a.ORDER_DATE, 3))     AS assumed_arrival_month,
                   a.dealer,
                   a.DLR_DELIVERY_DATE,
                   a.ORDER_DATE
              FROM seereur.seer_arcentity a, seereur.seer_dropdowns b
             WHERE     a.market_code IN ('UB')
                   AND a.MODEL IN ('00O')
                   AND a.DLR_DELIVERY_DATE IS NULL
                   AND a.pest = b.code
                   AND dropdown = 'PEST'
                   AND b.market_code = a.market_code)
     WHERE trunc(assumed_arrival_month, 'mm') >= 
                                     ADD_MONTHS(TRUNC(assumed_arrival_month, 'mm'), -5);
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      相关资源
      最近更新 更多