SELECT
CASE
WHEN
( SELECT COUNT ( * ) FROM MID_CARD ) = (
SELECT COUNT
( * )
FROM
MID_CARD
WHERE
SYNCFLAG = 1
) THEN
TRUE ELSE FALSE
END AS is_equal;
它适用于postgresql,但不适用于Oracle。在甲骨文中,我得到的错误是:
ORA-00923:未指定发件人关键字
请提出任何建议。提前谢谢。
在 Oracle 中,您需要指定 FROM DUAL。 表 DUAL 有 1 个虚拟记录,当没有可供选择的表时,允许选择 SELECT。
SELECT
CASE
WHEN
( SELECT COUNT ( * ) FROM MID_CARD ) = (
SELECT COUNT
( * )
FROM
MID_CARD
WHERE
SYNCFLAG = 1
) THEN
TRUE ELSE FALSE
END AS is_equal FROM DUAL;
您的代码存在几个问题:
-
在 Oracle 中,
SELECT
查询需要一个FROM
子句;如果没有实际的表可供选择,则可能会FROM DUAL
子句(这会导致您当前看到的错误( -
TRUE
和FALSE
不是可识别的表达式(您会得到错误"TRUE": invalid identifier
(
我认为您的查询可以简化如下:
SELECT CASE WHEN cnt = 0 THEN 'TRUE' ELSE 'FALSE'
FROM (SELECT COUNT(*) cnt FROM mid_card WHERE syncflag <> 1) x
基本上,这将返回字符串'TRUE'
或'FALSE'
,具体取决于mid_card
中是否至少有一个值具有syncflag
不等于 1 的记录。
您的 sql 语句在 oracle 语法和语义方面不完整,从 case 语句后的表名添加。
每个数据库在构建方式上都有一定的语法和语义,因此您不能只是比较。最标准的是使用 from 子句进行选择。
SELECT
CASE
WHEN
( SELECT COUNT ( * ) FROM
MID_CARD ) = (
SELECT COUNT
( * )
FROM
MID_CARD
WHERE
SYNCFLAG = 1
) THEN
'TRUE' ELSE 'FALSE'
END AS is_equal from dual;
你缺少from dual
. 但是,您可以简化任一数据库中的查询:
select (case when count(*) = sum(case when syncflag = 1 then 1 else 0 end)
then 'true' else 'false'
end)
from mid_card;
如果您确实想要一个子查询,则使用exists
会更有效(在两个数据库中(:
select (case when exists (select 1
from mid_card
where syncflag <> 1 -- or syncflag is null
)
then 'false' else 'true'
end)
from dual;
注意:我不认为甲骨文认识到true
和false
。 我把它们放在单引号里,所以它们是字符串。 更典型的是,我会用1
表示真,0
表示假。