【问题标题】:Oracle - Select a boolean? SELECT COUNT(*) > 0 FROM MYTABLEOracle - 选择一个布尔值?从 MYTABLE 中选择 COUNT(*) > 0
【发布时间】:2021-07-13 23:05:21
【问题描述】:

C#中执行的以下两条SQL语句为例。根据您使用的是MySQL 还是Oracle,它们会返回不同的值:

//MySQL / MariaDB:
1a. SELECT COUNT(*) FROM MYTABLE //returns long
2a. SELECT COUNT(*) > 0 FROM MYTABLE //returns int (1 if true, 0 if false)

//Oracle:
1b. SELECT COUNT(*) FROM MYTABLE //returns int
2b. SELECT COUNT(*) > 0 FROM MYTABLE //ORA-00923: FROM keyword not found where expected

我想知道是否有办法让语句 (2b) 与 Oracle 一起工作(选择一个布尔值,最好模仿 MySQL——如果为真,则为 0,如果为假,则为 0)。

我正在尝试避免使用特定于数据库的函数,例如 IF、IIF、IFNULL、CASE 等。我正在尝试编写数据库通用语句。

【问题讨论】:

    标签: c# mysql sql oracle boolean


    【解决方案1】:

    由于 Oracle SQL 中没有布尔数据类型,因此您无法真正避免 CASE(或 DECODE)。所以,对于一个空表,你会有这样的东西:

    SQL> select count(*) from test;
    
      COUNT(*)
    ----------
             0
    
    SQL> select case when count(*) > 0 then 'true'
      2              else 'false'
      3         end as result
      4  from test;
    
    RESUL
    -----
    false
    
    SQL>
    

    请注意,结果 - 在本例中 - 是一个 字符串!您可以返回其他内容,例如数字:

    SQL> select case when count(*) > 0 then 1
      2              else 0
      3         end as result
      4  from test;
    
        RESULT
    ----------
             0
    
    SQL>
    

    但正如我所说的,布尔值不在 SQL 中(在 PL/SQL 中是的,但这不是你要求的)。

    SQL> declare
      2    l_cnt      number;
      3    l_result   boolean;         --> this
      4  begin
      5    select count(*) into l_cnt from test;
      6
      7    l_result := l_cnt > 0;
      8  end;
      9  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      您可以使用case 表达式:

      select (case when count(*) > 0 then 1 else 0 end)
      from mytable;
      

      这将适用于两个数据库。不过一般使用exists会更快:

      select (case when exists (select 1 from mytable) then 1 else 0 end)
      from dual;
      

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        相关资源
        最近更新 更多