我有一个案例,我想要返回货币的汇率,但如果作业的日期是在1999年1月1日之前,那么我想只返回1/1/1999的汇率,因为exchange_rate表在1999年1月1日之前没有信息。因此,在这种情况下,如果COALESCE的返回日期是1/1/1985,则查询应该反而加入1/1/1999。
SELECT j.offer_date, j.accepted_date, j.reported_date, j.start_date, salary, salary_format_id, j.currency_id
FROM job j
LEFT JOIN exchange_rate c1 ON CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date) = c1.date AND c1.currency_id = j.currency_id
LEFT JOIN exchange_rate c2 ON CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date) = c2.date AND c2.currency_id = 1
WHERE j.job_id = 4793
答案 0 :(得分:2)
这样做:
CASE
WHEN COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) < '1999-01-01' THEN '1999-01-01'
ELSE COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date)
END
而且,是的,我知道这种重复性和很多内容,但它会完成工作。
答案 1 :(得分:1)
我个人会在选择部分中使用案例陈述
SELECT
CASE
WHEN date < '1999-01-01' THEN (SELECT TOP 1 [COLUMN_YOU_WANT] FROM exchange_rate AS c3 WHERE date = '1999-01-01' AND c3.currency_id = j.currency_id)
ELSE c1.[COLUMN_YOU_WANT]
END, j.offer_date, j.accepted_date, ...
基本上它说如果日期&lt; '1999-01-01'选择'1999-01-01'的费率,否则只使用从JOIN获得的费用。
答案 2 :(得分:0)
也许这样的事情就是你想要的:
LEFT JOIN exchange_rate c2 ON (
CASE
WHEN (CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date)) < '1999-01-01' THEN '1999-01-01'
ELSE CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date) END) = c2.date AND c2.currency_id = 1
不确定你是否真的需要具有合并的演员阵容。 (并删除它们似乎工作正常,但也许有一些情况需要施放。)
答案 3 :(得分:0)
你的问题不是很清楚,但我认为这就是你所需要的:
LEFT JOIN exchange_rate c1
on
(case when
CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date) < '1999-01-01'
then '1999-01-01'
else
CAST(COALESCE(j.offer_date, j.accepted_date, j.reported_date, j.start_date) AS date)
end ) = c1.date