如果我在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)