【问题标题】:Oracle, determine if value is nullOracle,判断值是否为空
【发布时间】:2018-08-27 18:24:53
【问题描述】:

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

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

where exists 的计算结果为假,结果为空。

结果不是 null 也不是布尔值,所以我测试这个结果的长度是否大于 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) { } ...
} 

谢谢

【问题讨论】:

  • 你想做什么?添加一些示例表数据和预期结果。 (格式化文本,而不是图像。)
  • 结果是一个空集,即没有返回行。
  • 如果没有匹配,那么您最终将得到一个包含 0 行的结果集。使用最合适的方法进行测试,例如OracleDataReader.HasRowsOracleDataReader.read() == true

标签: c# sql oracle sqlplus


【解决方案1】:

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

【讨论】:

  • 谢谢Littlefoot,我没想到。足以解决我的问题
  • 不,绝对不是;我也不用脸书 :)
  • 无赖,@Rahul;我以为我是独一无二的 :((开个玩笑!)
【解决方案2】:

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

select *
from passwordlog
where false

检查一下,如果你只是在下面做,记录数将是0

select count(*) from passwordlog where 1 = 0

【讨论】:

  • Where false 无效且布尔值不能在 Oracle SQL 中使用
  • false 在 SQL 中是不允许的,但可以使用 select * from passwordlog where 1 = 0
  • @KaushikNayak 不是在谈论甲骨文……这更像是一种解释
  • 拉胡尔:没关系。我只是想确保以后来这里寻求答案的人不应该盲目地复制粘贴答案并说它不起作用:-)
【解决方案3】:

像这样更改代码并尝试..

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

【讨论】:

    【解决方案4】:

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

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

    但是,您的子查询与主查询无关。无论您查看的是什么密码日志记录,它都是真或假。这意味着您要么选择所有密码日志记录,要么根本不选择。

    关于表达式计算结果为 false 时的问题(otherTable 中没有 uid=2 记录):这是您选择不记录的情况。您正在询问这是一个空字符串还是 null,但请记住:您没有选择任何行。如果您选择了一些行,您可能会询问特定行中的特定列,例如:第一行的密码是什么或第二行的用户 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 记录。

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多