与数据库行的csv值进行比较

时间:2015-10-01 19:35:51

标签: sql oracle11g

我有一个csv值列表,如('one','two','three','four'),这些值也存在于列的数据库中。

现在我想知道csv列表中的所有值,这些值在数据库中不存在。

例如,如果我的数据库列的值为'one','three','five','six','seven'。

然后我的结果应该返回值'two'和'four',因为它们存在于我的列表中但在数据库中不存在。

听起来很简单,但我被卡住了。

Here是带有示例的sql小提琴链接。

不想使用sqlfiddle(无论出于何种原因)的人的代码:

create table testcsv(
  csvnumber varchar2(100)
  );

INSERT ALL
  INTO testcsv VALUES ('one')
  INTO testcsv VALUES ('three')
  INTO testcsv VALUES ('five')
  INTO testcsv VALUES ('six')
  INTO testcsv VALUES ('seven')
SELECT * FROM dual;

select csvnumber from testcsv where csvnumber IN('one', 'two','three', 'four');
P.S:实际情况显然非常复杂,我已将其简化以获得想法。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。

该解决方案可在sqlfiddle here

上找到

查询:

(select substr(csv, 
   instr(csv,',',1,lev) + 1, 
   instr(csv,',',1,lev+1 )-instr(csv,',',1,lev)-1) 
from 
  (select ','||'one,two,three,four'||',' csv from dual), 
  (select level lev from dual connect by level <= 100) 
where lev <= length(csv)-length(replace(csv,','))-1)
MINUS
select csvnumber from testcsv where csvnumber IN('one', 'two','three', 'four');

也许不是最好的解决方案,但现在对我有用。