当咱们使用某个表达式做为输出的一列时,咱们没法再Where条件中直接使用该列做判断条件.
例以下面的SQL语句:html
select id, (c1 + c2) as s from t1 where s > 100
SQL Server 报错: "列名 s 无效"
固然,写成
select id, (c1 + c2) as s from t1 where (c1 + c2) > 100sql
就没问题了.
但是当表达式复杂时就很繁琐了.
有没有能够在Where中使用这样的列名的办法?
或者有什么其余办法能够解决这类问题呢?
解决方法:oracle
SQL code复制代码.net
select t2.* from (select id, (c1 + c2) as c from t1) t2 where c > 100 --或者 select t2.* from (select id, c = c1+c2 from t1) t2 where c > 100
因为在Where语句不能直接使用列别名,所以咱们须要将Sql语句给包装一下
在Oracle中,在WHERE子句中引用列别名会出错,这是为何呢?
由于:SELECT 语句的执行顺序
1. from语句
2. where语句(结合条件)
3. start with语句
4. connect by语句
5. where语句
6. group by语句
7. having语句
8. model语句
9. select语句
10. union、minus、intersect等集合演算演算
11. order by语句code
sqlserver查询的执行顺序是: (1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> (2)WHERE <where_predicate> (3)GROUP BY <group_by_specification> (4)HAVING <having_predicate> (5)SELECT DISTINCT TOP(<top_specification>) <select_list> (6)ORDER BY <order_by_list> 因此在where执行的时候,别名还不存在,而order by的时候已经存在
由于sql是在where后order by前加别名,即生成结果集后加别名,where是在生成结果集前的操做,order by是生成结果集后的操做,由于where要生成结果集,而order by是对结果集的操做。若是非要用别名,那么只能用派生表,即先生成别名再where select * from ( select 字段1 as A,字段2 as B.... from tablename ) aaa where A=1 order by A