选择表中未包含的行

本文关键字:包含 选择 | 更新日期: 2023-09-27 17:59:45

我有一个包含如下ID的表:

ID
----------------
10000V9F
10000V9O
10000VAh
10000VCB
10000VDn
10000VE9
10000VF4
10000VFE
10000VFH
10000VFW
10000VG9

现在,我想从另一个没有这些ID的表中获取所有数据。因此,我创建了一个类似于此的查询:

SELECT * from TABLE1 where ID NOT IN (...)

其中,...是通过另一个查询获得的ID列表,它包含来自第一个表的所有前面提到的ID。该列表定义如下:

string idString = "'" + String.Join("'", this.GetIDsForTableNames(newTables).ToArray()) + "'";

方法CCD_ 2还可以返回完全不包含元素的空列表。在这种情况下,从上面得到的查询将导致如下结果:

SELECT * from TABLE1 where ID NOT IN ('')

我希望从TABLE1返回所有ID。但是返回NONE。然而,当我激发SELECT * from TABLE1 where ID NOT IN ('a')时,其中a只是一个伪值,则返回来自TABLE1的所有行。

那么,我如何恰当地处理列表为空的情况,或者为什么它不适用于空列表?

编辑:好吧,似乎有些周围环境不够清晰。由于我不是自己构建SQL字符串(这是通过第三方工具完成的),我只能修改where子句,它只是某种最小化的SQL(不支持子查询和联接)。这就是我使用ID IN-技术的原因。

选择表中未包含的行

为什么它不适用于空列表?

这是因为两件事:

1.Oracle将空字符串视为空值

所以你的查询:

SELECT * from TABLE1 where ID NOT IN ('')

实际上相当于:

SELECT * from TABLE1 where ID NOT IN (NULL)

2.不在行为

NOT IN子句可以简化为对照列表检查所有值。如果任何值的结果是TRUE(该值在列表中)或NULL,则测试失败。

所有的检查都返回NULL,所以您的查询不会返回任何行。

这就是为什么它不适用于Oracle中的空列表。

回到你的问题:

我如何处理列表是空的情况适当

除了获取ID并将其包含在NOT IN子句中之外,您还必须找到其他方法
由于您无法控制查询,因此必须在您的三方工具中包含详细信息,并希望有一个解决方法。

更多信息:

  • Oracle/PLSQL:空字符串和null值之间的差异
  • 了解NULLs如何影响IN和EXISTS
  • Oracle中的NULL

注意:(以防某些SQL Server用户发现此帖子)
如果您使用的是SQL Server,那么您的查询会起作用,因为空字符串不会作为NULL处理
假设您已将ANSI_NULLS设置为OFF,则即使是第二个查询SELECT * from TABLE1 where ID NOT IN (NULL)也可以工作。这样的设置在Oracle中不可用。