【发布时间】: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')
这是我的结果
现在我想在某个月份(例如过去 5 个月)之间获取假设的到达月份(目前它给出了所有月份),但由于 assumed_arrival_month 位于所选区域中,因此无法在 where 条件之后放置和条件.如何实现?
【问题讨论】:
-
我没有阅读第一行代码(所以:我什至没有阅读你的问题)。在顶部的 CASE 表达式中,当日期不为空时,您有一个 WHEN 子句,当同一日期为空时,还有另一个 WHEN 子句,然后还有 ELSE。 ELSE 有什么用?日期要么不为空,要么为空;两个 WHEN 子句之一将始终为真,因此您永远不会到达 ELSE 分支。请解释一下这是怎么回事。
-
好的 - 现在我看到了这个问题。这是一个常见的问题。您不能在同一查询的 WHERE 子句中使用在 SELECT 子句中创建的名称。你有两个选择:一个是把它变成一个子查询,然后选择“从中” WHERE ....(并在外部查询中使用这里的名称);或者,在 WHERE 子句中从 SELECT 重复相同的长表达式。第二个选项不会为查询创建更多工作(表达式只计算一次并使用两次,用于 WHERE 和 SELECT),但代码更难看。第一个选项(更好)(........下面继续)
-
第一个选项(更好)也不会产生额外的工作,因为优化器将重写查询,消除额外的层 - 本质上优化器将根据第二个选项重写查询我给了你”无论如何。你不需要看到“丑陋的代码”,即使这正是优化器会做的事情。