选择表中未包含的行
本文关键字:包含 选择 | 更新日期: 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中不可用。