2016-12-06 13 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

おそらくありません。 1つは、その数式は結果0を生成しません。これは、「年齢」が0〜20の場合に望ましいものです。別の場合、帯域幅は均等ではなく、最初のバンドは20年、残りは10年です。 – mathguy

+0

ああ、そうです。アプローチはうまくいくかもしれませんが、表現はかなり複雑になります。 –

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 
関連する問題