Oracle - Select 布尔值? SELECT 计数(*) > 0 来自我的表
Oracle - Select a boolean? SELECT COUNT(*) > 0 FROM MYTABLE
以C#
中执行的以下两个SQL
语句为例。它们 return 不同的值取决于您使用的是 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--1 如果为真,0 如果为假)。
我试图避免使用特定于数据库的函数,如 IF、IIF、IFNULL、CASE 等。我正在尝试编写数据库通用语句。
您可以使用 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;
因为 Oracle SQL 中没有布尔数据类型,所以您无法真正避免 CASE
(或 DECODE
)。所以,对于一个空的 table,你会有这样的东西:
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>
以C#
中执行的以下两个SQL
语句为例。它们 return 不同的值取决于您使用的是 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--1 如果为真,0 如果为假)。
我试图避免使用特定于数据库的函数,如 IF、IIF、IFNULL、CASE 等。我正在尝试编写数据库通用语句。
您可以使用 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;
因为 Oracle SQL 中没有布尔数据类型,所以您无法真正避免 CASE
(或 DECODE
)。所以,对于一个空的 table,你会有这样的东西:
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>