为什么in值列表不能拼'CLARK','KING','MILLER','SCOTT'


csdn格式有问题,字被吃了,可以看下面的链接
http://fromwiz.com/share/s/2OSLun3V44CI2LVCy70ROCI31nJ7Hb3RrAVK21KHDM2HfHt6


为什么in值列表不能拼'CLARK','KING','MILLER','SCOTT'

因为in('MILLER','CLARK','KING')相当于

in(select ename from emp where deptno=10)

 
 
  1. select ename from emp where deptno=10;
  2. ENAME
  3. ----------
  4. CLARK
  5. KING
  6. MILLER

select ename from emp where deptno=10是返回的三行,也就是说in()相当于in N行,每一个''是一行

显然select ename from emp where deptno=10的每一行是不带引号的

我这种拼接相当于找ename= 'MILLER','CLARK','KING' 把他看作一个整体,因为他是一行

SQL> insert into emp_row values(1,q'[CLARK','KING','MILLER','SCOTT]');

1 row created.

SQL> select * from emp_row;

  2  

SQL> 

SQL> select * from emp_row;

        ID NAME

---------- ----------------------------------------

         1 CLARK','KING','MILLER','SCOTT

SQL> select * from emp_row where name in (select replace(v_in.emps, ',', q'[',']') from v_in);

        ID NAME

---------- ----------------------------------------

         1 CLARK','KING','MILLER','SCOTT

SQL> select replace(v_in.emps, ',', q'[',']') from v_in;

REPLACE(V_IN.EMPS,',',Q'[',']

-----------------------------

CLARK','KING','MILLER','SCOTT

SQL> select * from emp_row;

        ID NAME

---------- ----------------------------------------

         1 CLARK','KING','MILLER','SCOTT

如上所示证明了我的观点


而PLSQL中动态SQL实际就是拼出字符串,再把这个字符串当做SQL执行,所以是可以的

declare

  v_ename varchar(32);

begin

select rpad(lpad(replace(v_in.emps, ',', q'[',']'),length(replace(v_in.emps, ',', q'[',']')) + 1,''''),

            length(replace(v_in.emps, ',', q'[',']')) + 2,

            '''') into v_ename

  from v_in;

  

  execute immediate 'select max(ename) from emp where ename in ('||v_ename||')' into v_ename;

  

  dbms_output.put_line(v_ename);

  end;  


OUTPUT结果是 SCOTT



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值