我程序里有个无序、无规则、不定长数组。
现有ORACLE数据库里的表A(id varchar2(10)),
我想一次查出数组里的元素哪些不在表A的id字段里,请问怎么查啊?
例如数组元素为 ["aa","123","32a","sfs21",......]
表A的记录为 
aa
421
sfs21
bsda要求返回结果为:
123
32a我现在的办法是让程序根据数组自动拼成如下SQLselect B.id  from A ,
(
select 'aa' as id from dual
UNION 
select '123' as id from dual
UNION
select '32a' as id from dual
UNION
select 'sfs21' as id from dual
UNION
... ....
) B
where B.id = A.id(+) 
  and A.id is null确实能一次查出来正确的结果,但是这办法有点笨。
有无更好的方法呢? 

解决方案 »

  1.   

    select * from a
    where id not in ('aa','123','32a','sfs21'...);
      

  2.   

    数据
    aa 
    421 
    sfs21 
    bsda
    bb
    bb不可以检索出来的,要在('aa','123','32a','sfs21')范围内似乎没什么好办法吧
      

  3.   


    有差异哦,用他的SQL,结果会是
    421
    bsda不对哦
      

  4.   


    哦,了解你的意思了。你的参数是一个类似数组的字符串么用procedure来解决,临时表对于你来说是透明的,你看不到的。而且不会出现你说的有很多次和server端交互的问题。
      

  5.   

    在前台程序把字符数组用,相连接   然后用CHARINDEX函数  
      

  6.   

    10楼的XD
    你说是用带参数的存储过程吧?
    而且我这不是字符串,就是个字符串数组哦。当然,可以按照一定的格式拼成一个长字符串,到存储过程里再解析。
    嘿嘿,但是啊!XD我对procedure不熟啊
    其实我主要是想问怎么写这个SQL才能把我的数组变成一个虚拟的数据库表,这样就能和表A关联,取出不存在的记录了
      

  7.   


    理论上应该可以做一个function参数是你的字符串,返回值是一个数组,然后结合内存表table()函数这样的话,你的查询就变成了select * from 表A where not exists (select 1 from table(funcationname('aa','123','32a','sfs21')) b where 表A.col=b.col)关键是这个function了。
      

  8.   

    12楼
    返回的数组是指存储过程中像如下定义出来的一种集合吗?TYPE 数组类型 IS TABLE OF VARCHAR2(10)
    INDEX BY BINARY_INTEGER;
    数组名 数组类型;那么我要做的就是把我程序中的数组以特定格式变为字符串,如
    ["aa","123","32a","sfs21",......]  变成 "aa,123,32a,sfs21"
    定义PL/SQL中function为 functionname(varchar2),传入"aa,123,32a,sfs21"后
    会以逗号分隔然后将分隔后的每个短字符串作为元素加入到上面说的数组集合中,最后把数组返回。最后就是在程序中编写你的那条SQL:select * from 表A where not exists (select 1 from table(funcationname('aa','123','32a','sfs21')) b where 表A.col=b.col) 是这样理解吗?好像真的可以啊!
      

  9.   

    突然发现 function 不能直接返回上述的数组类型,
    是否要自定义 PL/SQL TYPE 啊
      

  10.   


    是的要先type一个类型出来 
      

  11.   

    哈哈哈哈!
    我觉得基本可以结贴了,虽然我还没完全实验通过
    但是我觉得inthirties给的思路可以实现!
    感谢zxf_feng,感谢Robin_Ares ,感谢ojuju10 ,感谢lg3605119 !
    特别感谢inthirties。
    同时感谢csdn,感谢cctv,感谢MTV,感谢所有TV,
    这么长时间以来对我的关心和鼓励,那啥~~~~~~~
    好!
      

  12.   


    谢谢你的关注啊,非常感谢。
     not in 查出的是表里有 , 数组没有的, 
    本来就是数组里没有的,用数组再去减,是无意义的啊。
    用IN倒是对的。但那几乎是把数据库中的数据全取出来了。
    这样的话在程序中比对的次数理论上会是: 数组元素个数×数据库记录数
    当两个数据量差不多而且都比较大的时候,再加上我用的是JAVA,会相应产生许多对象生成、内存分配的时间
    那么效率方面就有点恐怖了。。所以把比对的事情交给已经成熟的数据库处理,我认为是比较好的。
    谢谢你的关注啊,非常感谢。
      

  13.   

    晕,你们学Oracle数据库有没有安装