这样写是没问题的:
select row_number() over(order by (case when vipendtime<getdate() then 0 else viplevel end) desc) rownum,id, reallevel=(case when vipendtime<getdate() then 0 else viplevel end) from T_user
这样写就提示找不到列reallevel
select row_number() over(order by reallevel desc) rownum,id, reallevel=(case when endtime<getdate() then 0 else viplevel end) from T_user
row_number 不是最后才执行吗?执行时reallevel已经存在了啊,为什么不能这样写呢?第一种写法case when是不是执行两遍,效率会不会低?有没有好方法处理吗(在不添加计算列的情况下)?如果添加计算列这个reallevel添加索引有效吗?
------解决思路----------------------
row_number 不是最后才执行吗?执行时reallevel已经存在了啊,为什么不能这样写呢?
那也不是等其它结果出来才执行的啊,所以执行时reallevel不存在
case when判断不多的话,不会太慢
计算列可以添加索引
------解决思路----------------------
一个 select 子句中选取的字段/表达式是并列了,相互之间不能引用。
只有象 #1 一样嵌套之后,外层可以引用里层。
引用关系可以看成搭积木,只能在下层之上搭建,同层之间有搭建的需要就得分层。