【Oracle SQL】证明where子句先于select子句执行的例子 (副标题:如果where子句中出现了select子句定义的新字段,会出现ORA-00904: "NEWNAME": 标识符无效的错误)
有这么一张部门表:
create table dept( id number(3), name nvarchar2(20), primary key(id) );
可以这样给它充值:
insert into dept(id,name) values(1,'市场部'); insert into dept(id,name) values(2,'管理部');
还有这么一张雇员表:
create table emp( id number(3), name nvarchar2(20), deptid number(3), primary key(id) );
可以这样给它充值:
insert into emp(id,name,deptid) values(1,'鲁智深',1); insert into emp(id,name,deptid) values(2,'林冲',1); insert into emp(id,name,deptid) values(3,'武松',1); insert into emp(id,name,deptid) values(4,'宋江',2); insert into emp(id,name,deptid) values(5,'吴用',2); insert into emp(id,name,deptid) values(6,'晁盖',2);
如果要把雇员名字前面加上部门前缀显示出来,可以采用这种方式:
select (select name from dept where id=emp.deptid)||'-'||name as newName from emp
执行结果是:
SQL> select (select name from dept where id=emp.deptid)||'-'||name as newName from 2 emp; NEWNAME -------------------------------------------------------------------------------- 市场部-鲁智深 市场部-林冲 市场部-武松 管理部-宋江 管理部-吴用 管理部-晁盖 已选择6行。
但之后,如果想对newName进行模糊查询,会出现ORA-00904: "NEWNAME": 标识符无效
SQL> select (select name from dept where id=emp.deptid)||'-'||name as newName from 2 emp where newName like '%市场部%'; emp where newName like '%市场部%' * 第 2 行出现错误: ORA-00904: "NEWNAME": 标识符无效
出现这个错误的原因是:where子句先于select子句执行,因此where子句中出现select子句中新定义的字段自然不行。
要想对newName进行模糊查询,可以把
select (select name from dept where id=emp.deptid)||'-'||name as newName from emp
作为结果集,把条件写在外面,再查询一次,如下:
select * from (select (select name from dept where id=emp.deptid)||'-'||name as newName from emp) a where a.newName like '%市场部%'
往后就可以随便查了,如下:
SQL> select * from 2 (select (select name from dept where id=emp.deptid)||'-'||name as newName from 3 emp) a 4 where a.newName like '%市场部%'; NEWNAME -------------------------------------------------------------------------------- 市场部-鲁智深 市场部-林冲 市场部-武松 SQL> select * from 2 (select (select name from dept where id=emp.deptid)||'-'||name as newName from 3 emp) a 4 where a.newName like '%鲁%'; NEWNAME -------------------------------------------------------------------------------- 市场部-鲁智深 SQL> select * from 2 (select (select name from dept where id=emp.deptid)||'-'||name as newName from 3 emp) a 4 where a.newName like '%部-鲁%'; NEWNAME -------------------------------------------------------------------------------- 市场部-鲁智深
END
分类:
Oracle.繁难Sql文
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2018-04-19 【Canvas与标志】黄色圆角竖立正方形NoJobs标志
2018-04-19 【高中数学/指数、对数】已知a=e^0.03-1,b=3/103,c=ln1.03,则a、b、c的大小关系为?
2014-04-19 【Canvas与图标】四陀螺结图标120*120
2014-04-19 【颜色】搭配起来好看的两种颜色