【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

posted @   逆火狂飙  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需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 【颜色】搭配起来好看的两种颜色
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示