预言机,确定值是否为空



如果我在sqldeveloper(或sqlplus)中运行以下查询:

select *
from passwordlog
where exists(
select USERUID 
from otherTable 
where uid=2
);

并且where exists的计算结果为 false,结果只是空的。

结果既不是空值也不是布尔值,所以我测试这个结果的长度是否大于 1。

但我只是开始怀疑。结果到底是什么?它是空字符串吗?还是空?有没有比检查返回字符串的长度更好的方法来执行此检查?

我希望能够做这样的事情(假设我们有Oracleconnection,OracleDataAdapter等):

string query = select *
from passwordlog
where exists(
select USERUID 
from otherTable 
where uid=2
);

然后在 C# 方法中:

public void SomeMethod() {
if(query == null) { } ...
or maybe
if(query == false) { } ...
} 

谢谢

由于您只检查某些内容是否"存在"(至少,这是您的 C# 代码的样子),如果您 - 而不是select *- 使用select count(*),您可以将其修复为COUNT如果没有要返回的内容,它将返回 0(零),因此您可以轻松地在 C# 代码中检查它。

通常在EXISTS子查询中,您会引用主查询中的记录,例如,找出密码日志的用户标识是否存在 otherTable 条目:

select *
from passwordlog p
where exists (select * from otherTable o where o.uid = p.uid);

但是,您的子查询与主查询不相关。它要么是真的,要么是假的,无论你正在查看什么密码日志记录。这意味着您可以选择所有密码日志记录,或者根本不选择任何密码日志记录。

至于当表达式计算结果为 false 时您的问题(otherTable 中没有 uid=2 条记录):在这种情况下,您选择没有记录。您正在询问这是空字符串还是空字符串,但请记住:您没有选择任何行。如果您选择了一些行,则可以请求特定行中的特定列,例如:第一行的密码是什么或第二行中的用户ID是什么?但是,您当然不能问"第零行中的列是什么"。

至于仅仅检查 otherTable 中的 uid=2 记录是否存在,那将是

select exists (select * from otherTable where uid = 2);

在标准 SQL 中返回布尔值。但是,在 Oracle 中,您必须始终从表(一行的双表)中进行选择,并且没有布尔数据类型。因此:

select 
case when exists (select * from otherTable where uid = 2) then 1 else 0 end
from dual;

另一种选择是计算记录,但当您只想知道至少一条记录是否匹配时,您不想读取所有记录并一直计数。在 Oracle 中,您可以使用 rownum 来实现:

select count(*)
from otherTable
where uid = 2 and rownum = 1;

Oracle 将在第一个匹配项处停止,因此返回 0 或 1,具体取决于 otherTable 中是否存在 uid=2 记录。

它是一个空的结果集或记录集。因此,下面的查询可以简化为。因此,不会选择任何行,因为谓词是false。因此,您检查 no.of 行> 1 也总是错误的

select *
from passwordlog
where false

检查一下,如果您只是执行以下操作,则记录计数将0

select count(*) from passwordlog where 1 = 0

像这样更改代码并尝试。

select count(*)
from  passwordlog
where exists (select useruid
from othertable 
where uid=2)

最新更新