2011-11-28 72 views
1

我有一个场景,我需要将CSV格式字符串中的'name ids'作为绑定参数传递给SQL查询,并检查表中是否存在任何该ID 。它与表格中的列中的表名id相关的ID数组的异或。在SQL查询中执行两个数组的XOR

我无法知道如何做到这一点(数组与列的比较)。你能指出我朝那个方向吗?

我无法使用Java或PL/Sql,因为我的查询将被另一个在运行时处理的团队使用。

+0

你还没有提出过一个问题 – Icarus

+0

编辑了这个问题:) – Himz

+0

编辑了答案:) –

回答

2

,如果你绑定多个值,而不是单个字符串, 你可以从你的CSV值做一个表:

select column_value as id 
from table(sys.dbms_debug_vc2coll('linia 1','linia 2','linia 3')) 

并使用如下语句使XOR

select a.id,b.id 
from 
    table a 
    full outer join 
    (query)b 
    on a.id=b.id 

希望这可以帮助你。

更新:我发现here查询从CSV格式的值,制作表格:

with query2 as (
    select substr(:mylist, 
        instr(','||:mylist||',', ',', 1, rn), 
        instr(','||:mylist||',', ',', 1, rn+1) 
        - instr(','||:mylist||',', ',', 1, rn) - 1) value 
    from (select rownum rn from dual 
     connect by level 
         <= length(:mylist)-length(replace(:mylist,',',''))+1) 
    ) 
    select value 
    from query2 
0
在Oracle 10g及以上版本可以转换一个CSV参数(mycsv)使用列

SELECT REGEXP_SUBSTR(mycsv,'[^,]+',1,LEVEL) element       
FROM dual      
CONNECT BY LEVEL < LENGTH(REGEXP_REPLACE(mycsv,'[^,]+')) + 1 

然后使用IN子句和上述作为一个子查询

SELECT * FROM t1 
WHERE id IN (....the query above...)