最近刚学SQL 老师出了一条题目作业:显示学生的姓名,年龄信息,年龄信息不显示具体的数字,而显示这一的信息:如果小于20岁,则显示年轻;如果20-50岁,则显示中年;如果大于50岁,显示老年我按照书本上的语句自己凑了出来select sname AS 姓名,年龄段=CASE
    when datediff(year,birthday,getdate())<'20' then '青年'
    when datediff(year,birthday,getdate())>='20' and datediff(year,birthday,getdate())<='50' then '中年'
    else '老年'
  end
from s但是datediff(year,birthday,getdate())这个重复了N次
我就有个疑问了,难道函数不能赋值到一个自定义的变量上么?请问如果这题用我说的写法 该怎么写?

解决方案 »

  1.   

    不可以赋值到一个变量,因为datediff(year,birthday,getdate())的内容是跟的不同的行值改变,除非生成一个新派生表,用JOIN来联查。
      

  2.   


    select sname AS 姓名,年龄段=CASE
        when datediff(year,birthday,getdate())<'20' then '青年'
        when datediff(year,birthday,getdate())<='50' then '中年'
        else '老年'
      end
    from s不过你的条件可以简略一下
    datediff(year,birthday,getdate())>='20'
    这句没什么用
      

  3.   


    如果这样写的话第二个when的意思不就是小于50的都是中年? 还是说 when是执行完第一个条件如果不符合再执行第二个条件?
      

  4.   

    你这个写法没有任何问题,很好.
    不过可以稍微精简一下.select sname AS 姓名,年龄段=CASE
        when datediff(year,birthday,getdate()) < 20 then '青年'
        when datediff(year,birthday,getdate()) between 20 and 50 then '中年'
        else '老年'
      end
    from s
      

  5.   

    会按照你的判断顺序,一个一个条件顺序执行的。另:你说的可以赋值给变量,我就知道一张就是嵌套表形如
    select sname AS 姓名,年龄段=CASE
        when age <'20' then '青年'
        when age <='50' then '中年'
        else '老年'
      end
    from 
    (
    select sname,datediff(year,birthday,getdate()) age from s
    ) m语法未校验。效率还没原来的高
      

  6.   

    我刚刚试了试 三楼那位哥说的可行,我想应该就是我理解的那样了!!!五楼 的between 原来还有这样的一个运算符,谢谢了!!!
      

  7.   


    谢谢啦!!!原来有那么多写法,效率我不计算 我刚刚才学习SQL 语法想学多点,想看看这个有多少种写法 学习学习sql的语法!!!,大家举例的都是很简单的!!
    我一看就懂了 谢谢大家!!!