表格中没有WHERE CLAUSE LIST中的哪些值

时间:2014-06-23 07:28:28

标签: sql oracle

我想搜索表中没有MY WHERE CLAUSE LIST中的哪个值。

表名是test

Column1
--------------
1
2
3

我的查询:我有一个搜索列表2,3,4,5,我想知道哪些都不在我的数据库中。当我查询时,我应该得到4,5和不是1.

我不想要表格中的值列表而不是where子句列表(select * from test其中column1不在(2,3,4,5)

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

  WITH my_list AS
  (SELECT regexp_substr('2,3,4,5', '[^,]+', 1, LEVEL) AS search_val
  FROM dual
    CONNECT BY level <= regexp_count('2,3,4,5',',') + 1
  )
SELECT *
FROM my_list
WHERE NOT EXISTS
  (SELECT 'X' FROM YOUR_TABLE WHERE YOUR_COLUMN = search_val
  );

让我们将逗号分隔值转换为视图,然后执行所需操作。

答案 1 :(得分:0)

您可以按照以下方式执行此操作:

SELECT List FROM
(SELECT 2 as List
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5) T
WHERE List NOT IN
      (SELECT Column1 FROM TableName)

答案 2 :(得分:0)

with cte as
 (select 2 as val from dual
  union all 
  select 3 from dual
  union all 
  select 4 from dual
  union all 
  select 5 from dual
  union all 
 )
select * from cte as t1
where not exists 
  ( select * from test as t2 where t1.val = t2.column1) 

对于大量值,您可以更好地创建临时表,插入行,然后使用它而不是公用表表达式。

答案 3 :(得分:0)

在这种情况下,我会做一个简单的选择

select *
from test
where column1 in (2, 3, 4, 5)

并使用宿主语言(Java,C ++,Perl,...)执行set操作。

这似乎比任何SQL解决方案都简单得多。

答案 4 :(得分:0)

尝试以下查询:

 WITH MY_DATA_TABLE AS
(
    SELECT regexp_substr('2,3,4,5', '[^,]+', 1, LEVEL) AS MY_DATA_VALUE
    FROM dual
    CONNECT BY level <= (length('2,3,4,5') - length(replace('2,3,4,5', ',')))
  )
SELECT *
FROM MY_DATA_TABLE
WHERE NOT EXISTS
  (SELECT 'TRUE' FROM TABLE_NAME WHERE TABLE_FIELD_VALUE = MY_DATA_VALUE
  );

您的大量数据查询会在ORACLE中转换为:

 WITH MY_DATA_TABLE AS
(
    SELECT regexp_substr('1,4,5,8,9,12,13,14,20,39,43,48,51,54,55,57,61,65,68,75,78,80,81,82,91,92,96,99,‌​102,103,109,112,113,224,227,249,250,251,600,601,604,605,608,609,614,802', '[^,]+', 1, LEVEL) AS MY_DATA_VALUE
    FROM dual
    CONNECT BY level <= (length('1,4,5,8,9,12,13,14,20,39,43,48,51,54,55,57,61,65,68,75,78,80,81,82,91,92,96,99,‌​102,103,109,112,113,224,227,249,250,251,600,601,604,605,608,609,614,802') - length(replace('1,4,5,8,9,12,13,14,20,39,43,48,51,54,55,57,61,65,68,75,78,80,81,82,91,92,96,99,‌​102,103,109,112,113,224,227,249,250,251,600,601,604,605,608,609,614,802', ',')))
  )
SELECT *
FROM MY_DATA_TABLE
WHERE NOT EXISTS
  (SELECT 'TRUE' FROM TABLE_NAME WHERE TABLE_FIELD_VALUE = MY_DATA_VALUE
  );