SQL条件日期COALESCE

时间:2014-08-26 20:38:12

标签: sql sql-server join

我有一个案例,我想要返回货币的汇率,但如果作业的日期是在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

4 个答案:

答案 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