Sql 在ORACLE:ORA-00923中:未指定FROM关键字 选择 案例 什么时候 从MID_卡选择计数* 选择计数 * 从…起 中印卡 哪里 SYNCFLAG=1 然后 对还是错 一视同仁;

Sql 在ORACLE:ORA-00923中:未指定FROM关键字 选择 案例 什么时候 从MID_卡选择计数* 选择计数 * 从…起 中印卡 哪里 SYNCFLAG=1 然后 对还是错 一视同仁;,sql,oracle,Sql,Oracle,它适用于postgresql,但不适用于Oracle。在Oracle中,我得到的错误为: ORA-00923:未指定From关键字 有什么建议吗。提前感谢。在Oracle中,您需要从双精度中指定。表DUAL有一个虚拟记录,当没有可供选择的表时,该记录允许选择 SELECT CASE WHEN ( SELECT COUNT ( * ) FROM MID_CARD ) = ( SELECT COUNT ( * ) FROM MID_CARD

它适用于postgresql,但不适用于Oracle。在Oracle中,我得到的错误为:

ORA-00923:未指定From关键字


有什么建议吗。提前感谢。

在Oracle中,您需要从双精度中指定。表DUAL有一个虚拟记录,当没有可供选择的表时,该记录允许选择

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子句;如果没有实际的表可供选择,则这可能来自DUAL。这会导致您当前看到的错误

TRUE和FALSE是不可识别的表达式。您将得到错误TRUE:无效标识符

我认为你的问题可以简化如下:

SELECT CASE WHEN cnt = 0 THEN 'TRUE' ELSE 'FALSE'
FROM (SELECT COUNT(*) cnt FROM mid_card WHERE syncflag <> 1) x

基本上,这将返回字符串'TRUE'或'FALSE',这取决于mid_卡中是否至少有一个值具有syncflag不等于1的记录。

您的sql语句在oracle语法和语义方面不完整,请在case语句之后从tablename添加

每个数据库在其构建方式上都有特定的语法和语义,因此您不能只进行比较。大多数标准使用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;
你从双重身份中失踪了。但您可以简化任一数据库中的查询:

select (case when count(*) = sum(case when syncflag = 1 then 1 else 0 end)
             then 'true' else 'false'
        end)
from mid_card;
如果确实需要子查询,则使用exists在两个数据库中都更有效:


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

谢谢你的指导,我确实遇到了第二种情况。
select (case when exists (select 1
                          from mid_card
                          where syncflag <> 1  -- or syncflag is null
                         )
             then 'false' else 'true'
         end)
from dual;