Oracle,确定value是否为null

时间:2018-03-19 08:45:24

标签: c# sql oracle sqlplus

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

由于

4 个答案:

答案 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)