如果我在sqldeveloper(或sqlplus)中运行以下查询:
select *
from passwordlog
where exists(
select USERUID
from otherTable
where uid=2
);
并且where exists
的计算结果为false,结果为空。
结果不是null或布尔值,所以我测试这个结果的长度是否大于1.
但我开始怀疑。结果真的是什么?这是一个空字符串吗?还是null?有没有比检查返回字符串长度更好的方法来执行此检查?
我希望能够做这样的事情(假设我们有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) { } ...
}
由于
答案 0 :(得分:4)
当您只检查某些内容是否“存在”时(至少,这是您的C#代码的样子),如果您 - 而不是select *
- 使用select count(*)
,您可能会将其修复为如果没有任何内容可以返回,COUNT
将返回0(零),因此您可以在C#代码中轻松检查它。
答案 1 :(得分:2)
这是一个空的结果集或记录集。所以下面的查询可以简化为。因此,由于谓词为VertxUnit
,因此不会选择任何行。所以,检查是否有行> 1也总是假的
JQuery
要检查,如果您在下面执行此操作,则记录计数将为$("#fileInput").change(function () {
$('#form').submit();
});
false
答案 2 :(得分:2)
通常在EXISTS
子查询中,您将引用主查询中的记录,例如:找出密码日志的用户ID是否存在otherTable条目:
select *
from passwordlog p
where exists (select * from otherTable o where o.uid = p.uid);
但是,子查询与主查询无关。无论是正确还是错误,无论您正在查看什么密码日志记录。这意味着您要么选择所有密码日志记录,要么根本不选择任何密码记录。
关于表达式求值为false时的问题(otherTable中没有uid = 2记录):这是你没有选择记录的情况。您在询问这是一个空字符串还是null,但请记住:您没有选择任何行。如果您选择了某些行,则可能要求特定行中的特定列,例如:第一行中的密码是什么,或者第二行中的用户ID是什么?但当然你不能问“第0行中的列是什么”。
仅仅检查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记录是否存在。
答案 3 :(得分:0)
改变这样的代码并尝试..
select count(*)
from passwordlog
where exists (select useruid
from othertable
where uid=2)