在 ORACLE:ORA-00923: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;

它适用于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子句(这会导致您当前看到的错误(

  • TRUEFALSE不是可识别的表达式(您会得到错误"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;

注意:我不认为甲骨文认识到truefalse。 我把它们放在单引号里,所以它们是字符串。 更典型的是,我会用1表示真,0表示假。

最新更新