【问题标题】:Compare with csv values with database rows将 csv 值与数据库行进行比较
【发布时间】:2015-10-02 04:07:58
【问题描述】:

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

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

例如,如果我的数据库列具有值“一”、“三”、“五”、“六”、“七”。

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

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

Here 是带有示例的 sql fiddle 链接。

不想使用 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:实际场景显然要复杂得多,我已经简化了它以获得想法。

【问题讨论】:

  • 列表从何而来?您可能需要将该列表放入关系结构中。如果您的列表来自针对其他表的 SELECT 语句,那将是微不足道的。如果它来自其他地方,那就更痛苦了。
  • 它不是来自另一个表,然后我可以加入它们,它是由其他人提供的静态值列表。
  • 我可以在不创建新表和存储数据的情况下使用双表来做我需要的事情吗?
  • 提供了如何。他们是否将逗号分隔的字符串传递给存储过程,例如,正在运行查询?如果是这样,您可以将字符串解析为本地集合并使用它。
  • 不,这不是整个此类过程的一部分,假设这些值来自每日邮件,我必须手动提取这些值。

标签: sql oracle11g


【解决方案1】:

我找到了解决办法。

解决方案在 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');

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多