case case语句是否应用于select语句中生成的列?

时间:2014-08-30 10:30:18

标签: sql-server-2008

我现在在select语句中生成了一个列,我想在它上面应用一个case语句。我知道case语句只能应用于数据库中的列,但我想知道有没有其他选择?

我的代码是:

SELECT B.reg_no,B.dist_no,B.RDT_NAME,A.YTD_PQ,
RANK() OVER (PARTITION BY B.reg_no ORDER BY A.YTD_PQ DESC) AS Rank_1,
CASE Rank_1 WHEN '1' THEN 'YES' ELSE 'NO' END AS NVARCHAR(10)
FROM OTHER_AWARDS AS B 
JOIN MT_D AS A
ON A.RDT = B.RDT

现在我想知道如何在select语句中生成的Rank_1列上应用Case。

2 个答案:

答案 0 :(得分:1)

我记得你不能在语句的同一级别上引用计算列,因为在你引用它时它是未知的(或处理过的),但在这种情况下重用了rank()函数声明应该有效,所以试试这个:

SELECT B.reg_no,B.dist_no,B.RDT_NAME,A.YTD_PQ,
RANK() OVER (PARTITION BY B.reg_no ORDER BY A.YTD_PQ DESC) AS Rank_1,
CASE RANK() OVER (PARTITION BY B.reg_no ORDER BY A.YTD_PQ DESC) WHEN '1' THEN 'YES' ELSE 'NO' END 
FROM OTHER_AWARDS AS B 
JOIN MT_D AS A
ON A.RDT = B.RDT

答案 1 :(得分:0)

是。将查询包装为内部查询,然后可以将所有列视为常规列,例如:

select case when computed_column ... end
from (
    select rank() ... as computed_column
    from ...
} q

在你的情况下看起来像:

SELECT *, CASE Rank_1 WHEN '1' THEN 'YES' ELSE 'NO' END AS NVARCHAR(10)     
FROM (
  SELECT B.reg_no,B.dist_no,B.RDT_NAME,A.YTD_PQ,
  RANK() OVER (PARTITION BY B.reg_no ORDER BY A.YTD_PQ DESC) AS Rank_1
  FROM OTHER_AWARDS AS B
  JOIN MT_D AS A ON A.RDT = B.RDT
) q