2016-12-06 46 views
0

使用表達式別名我有以下查詢,任何方式給予在CASE語句

SELECT CASE 
     WHEN floor(months_between(CAL_DATE, BIRTH_DATE)/12) BETWEEN 0 
       AND 20 
      THEN '1' 
     WHEN floor(months_between(CAL_DATE, BIRTH_DATE)/12) BETWEEN 21 
       AND 30 
      THEN '2' 
     WHEN floor(months_between(CAL_DATE, BIRTH_DATE)/12) BETWEEN 31 
       AND 40 
      THEN '3' 
     WHEN floor(months_between(CAL_DATE, BIRTH_DATE)/12) BETWEEN 41 
       AND 50 
      THEN '4' 
     ELSE '5' 
     END) Age_Band 
FROM dual 

有沒有什麼辦法讓別名來表達floor(months_between(CAL_DATE, BIRTH_DATE)/12),並用它在case語句像下面。

CASE floor(months_between(CAL_DATE, BIRTH_DATE)/12) **age** 
     WHEN **age** BETWEEN 0 AND 20 THEN '1' 

回答

-1

只有當你使用子查詢:

SELECT CASE 
    WHEN z.flor BETWEEN 0 AND 20 THEN '1' 
    WHEN z.flor BETWEEN 21 AND 30 THEN '2' 
    WHEN z.flor BETWEEN 31 AND 40 THEN '3' 
    WHEN z.flor BETWEEN 41 AND 50 THEN '4' 
    else '5' end Age_Band 
FROM (SELECT floor(months_between 
     (CAL_DATE, BIRTH_DATE)/12) flor 
     From dual)z 

,但你也可以這樣做:

Select case when months_between(CAL_DATE, BIRTH_DATE) > 60 then 5 
     else 1 + floor(months_between(CAL_DATE, BIRTH_DATE)/240) end 
From dual 

不會做同樣的事情?

+0

可能不是。首先,該公式決不會產生結果0,當「年齡」介於0和20之間時,結果爲0。另一方面,頻帶甚至不是寬度 - 第一個爲20年,其餘爲10年。 – mathguy

+0

ahhh是的,你說得對。這種方法可行,但表達方式必須要複雜得多。 –

0

但是,您不能別名CASE語句,有時爲了使事情更具可讀性和緊湊性,我使用子查詢進行計算。

SELECT CASE 
     WHEN calc.date_value BETWEEN 0 
       AND 20 
      THEN '1' 
     WHEN calc.date_value BETWEEN 21 
       AND 30 
      THEN '2' 
     WHEN calc.date_value BETWEEN 31 
       AND 40 
      THEN '3' 
     WHEN calc.date_value BETWEEN 41 
       AND 50 
      THEN '4' 
     ELSE '5' 
     END 
FROM 
(
SELECT 
    date_value=floor(months_between(CAL_DATE, BIRTH_DATE)/12) 
FROM 
    dual 
)AS calc 
0

您可以使用CTE或子查詢。這是CTE,因爲其他人有一個子查詢:

WITH floor AS 
(
    SELECT floor(months_between(CAL_DATE, BIRTH_DATE)/12) AS floor 
    FROM dual 
) 
SELECT CASE 
    WHEN f.floor BETWEEN 0 AND 20 THEN '1' 
    WHEN f.floor BETWEEN 21 AND 30 THEN '2' 
    WHEN f.floor BETWEEN 31 AND 40 THEN '3' 
    WHEN f.floor BETWEEN 41 AND 50 THEN '4' 
    ELSE '5' END AS Age_Band 
FROM floor f