簡體   English   中英

如何聲明查詢值並在 CASE 中使用它?

[英]How to declare a queried value and use it in 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 是學生表中的列。

謝謝!

不,不在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 . 如果您想更改邊界,這將變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM