1

我对 Oracle 很陌生,我正在为我的项目开发一个查询。对我来说,似乎一切正常,但是在执行查询时,oracle 给出了错误“ORA-00905:缺少关键字”。

她是我的疑问::

SELECT DISTINCT ba.uuid AS uuid
     , COUNT(*) over() AS rowcount 
FROM basicaddress ba 
WHERE ba.postalcode='143456' 
   OR ba.lastname LIKE '%143456%' 
   OR ba.city LIKE '%143456%'
GROUP BY CASE WHEN ba.postalcode='143456' THEN ba.postalcode, ba.uuid END
       , CASE WHEN ba.lastname LIKE '%143456%' THEN ba.lastname, ba.uuid END
       , CASE WHEN ba.city LIKE '%143456%' THEN ba.city, ba.uuid 
                                           ELSE ba.postalcode,ba.uuid END 
ORDER BY CASE WHEN ba.postalcode='143456' THEN ba.postalcode END DESC
       , CASE WHEN ba.lastname LIKE '%143456%' THEN ba.lastname END ASC
       , CASE WHEN ba.city LIKE '%143456%' THEN ba.city ASC 
                                           ELSE ba.postalcode END DESC

我缺少什么关键字?任何帮助将不胜感激。

4

2 回答 2

2

错误在您的CASE陈述中

CASE 
  WHEN ba.postalcode='143456' 
  THEN ba.postalcode, ba.uuid  <-- here. You can return value of only one column
END;                          

ba.postalcode您必须在和 之间做出决定ba.uuid。或者,如果您想查看最终结果集中两列的值,请使用||将它们连接起来。使用隐式或显式类型转换的运算符或CONCAT函数。

于 2012-09-23T15:26:27.110 回答
0

我怀疑你打算ELSE在你的表达中使用一个子句CASE,可能是这样的:

SELECT DISTINCT ba.uuid AS uuid
     , COUNT(*) AS rowcount
FROM basicaddress ba  
WHERE ba.postalcode='143456'
   OR ba.lastname LIKE '%143456%'
   OR ba.city LIKE '%143456%' 
GROUP BY CASE WHEN ba.postalcode='143456' 
              THEN ba.postalcode
              ELSE ba.uuid END
       , CASE WHEN ba.lastname LIKE '%143456%' 
              THEN ba.lastname
              ELSE ba.uuid END
       , CASE WHEN ba.city LIKE '%143456%' 
              THEN ba.city
              ELSE ba.postalcode,ba.uuid END
ORDER BY CASE WHEN ba.postalcode='143456'
              THEN ba.postalcode END DESC
       , CASE WHEN ba.lastname LIKE '%143456%' 
              THEN ba.lastname END ASC
       , CASE WHEN ba.city LIKE '%143456%'
              THEN ba.city ASC
              ELSE ba.postalcode END DESC

您也不需要函数over()上的子句。COUNT()此外,我以一种希望使语法更易于理解的方式重新编写了您的查询,并纠正了我认为您的一个CASE表达式中的语法错误。请注意,为了安全起见,您应该始终提供ELSE条件。我会把那部分留给你。

于 2012-09-23T16:01:09.250 回答