【问题标题】:Select inside CASE THEN在 CASE THEN 中选择
【发布时间】:2015-08-25 19:57:21
【问题描述】:

我需要选择生效日期小于今天的项目费率或班次率。

 SELECT 
 CASE 
    WHEN ISNULL(s.rate,0) = 0 
    THEN SELECT TOP 1 pr.rate FROM ProjectRates pr WHERE (pr.projectID = p.ID) AND (pr.effectiveDate < GETDATE()) ORDER BY pr.effectiveDate DESC
    --p.rate 
    ELSE SELECT TOP 1 sr.rate FROM ShiftRates sr WHERE (sr.shiftID = s.ID) AND (sr.effectiveDate < GETDATE()) ORDER BY pr.effectiveDate DESC                
    --s.rate 
END AS rate
FROM Projects p
INNER JOIN Shifts s ON (p.ID = s.projectID)
WHERE (p.ID = @projectID)

请注意,此代码 sn-p 是较大存储过程的一部分,因此它必须在 CASE 语句中。

【问题讨论】:

  • 有什么问题?

标签: sql sql-server


【解决方案1】:

子查询需要括号:

SELECT (CASE WHEN ISNULL(s.rate, 0) = 0 
             THEN (SELECT TOP 1 pr.rate
                   FROM ProjectRates pr
                   WHERE (pr.projectID = p.ID) AND (pr.effectiveDate < GETDATE())
                   ORDER BY pr.effectiveDate DESC
                  )
             ELSE (SELECT TOP 1 sr.rate
                   FROM ShiftRates sr
                   WHERE (sr.shiftID = s.ID) AND (sr.effectiveDate < GETDATE()) 
                   ORDER BY pr.effectiveDate DESC                
                  ) --s.rate 
        END) AS rate
FROM Projects p INNER JOIN
     Shifts s 
     ON p.ID = s.projectID
WHERE p.ID = @projectID;

【讨论】:

  • 完美,正是我想要的!
猜你喜欢
  • 2013-03-25
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2018-12-25
  • 1970-01-01
  • 2022-11-30
  • 2017-07-22
相关资源
最近更新 更多