如何声明查询值并在CASE中使用它?

时间:2016-09-30 01:22:23

标签: sql sql-server case

我想将DOB转换为数字年龄,然后将年龄值分配到SQL Server上的不同年龄组。

我找到了第一步的方法,第二步理想情况下我应该将第一步的结果设置为变量并让它在CASE语句中进行比较。但是,我不知道声明并设置变量并在CASE中使用它。

我拿着我想要的桌子,傻逼如下:

SELECT FirstName, LastName,
    CAST(
        CASE
            WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER)) / 365.25) < 18
                THEN 'Under 18'
            WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER)) / 365.25) BETWEEN 19 AND 30
                THEN '19-30'
            WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER)) / 365.25) > 30
                THEN 'Over 30'
            ELSE 'ERROR'
    END AS VARCHAR(10)) AS Age
FROM Student

我的问题:有没有办法将“FLOOR((CAST(GetDate()AS INTEGER) - CAST(DOB AS INTEGER))/ 365.25)”设置为变量并在其中使用CASE声明?

* FirstName,LastName和dbo是学生表中的列。

谢谢!

1 个答案:

答案 0 :(得分:4)

不,不在case声明中。两个传统的建议是使用CTE或子查询。但是,SQL Server还支持apply

SELECT FirstName, LastName,
       (CASE WHEN v.age <= 18 THEN 'Under 18'
             WHEN v.age <= 30 THEN '19-30'
             WHEN v.age > 30 THEN 'Over 30'
             ELSE 'ERROR'
        END) AS Age
FROM Student s OUTER APPLY
     (VALUES (FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER)) / 365.25) )
     ) as v(age);

评论:

  • 您无需将字符串转换为varchar(10)。这只是多余的。
  • 按顺序评估case,因此您不需要between。如果您想更改边界,这会更容易。