我有一个应用程序,它会在 WHERE 条件后自动添加括号并将其发送到 JDBC Oracle 驱动程序,Oracle 不喜欢它并抛出:ORA-00907:缺少右括号
我不确定如何在 Oracle 语法范围内使用它,但是有什么建议可以修复它并使其具有此括号,或者语法不支持它吗?
原始查询工作得很好:
SELECT count(*) as ErrorCount, Engine_name, to_char(log_time,'hh24') as Hour FROM eailog_data.err_log WHERE err_timestamp > sysdate-1/24 GROUP BY engine_name, to_char(log_time,'hh24') HAVING count(*) > 100 AND count(*) > 0 ORDER BY count(*)
第 3 方应用程序对其进行如下修改(注意在 WHERE 条件后添加括号):
SELECT count(*) as ErrorCount, Engine_name, to_char(log_time,'hh24') as Hour
FROM eailog_data.err_log
WHERE
(
err_timestamp > sysdate-1/24
GROUP BY engine_name,
to_char(log_time,'hh24')
HAVING count(*) > 100
)
AND count(*) > 0
ORDER BY count(*)
有什么想法可以通过添加括号来修复 SQL 吗?
最佳答案
WHERE
子句括号表达式需要在 WHERE
子句末尾结束,并且 HAVING
子句中的条件以括号结束,但从未开始。
就添加括号而言,当然可以在 WHERE
子句的末尾添加一个括号,并在 HAVING
子句的开头添加一个括号,如下所示:
SELECT count(*) AS errorcount,
engine_name,
to_char(log_time,'hh24') AS HOUR
FROM eailog_data.err_log
WHERE ( err_timestamp > SYSDATE-1/24 )
GROUP BY engine_name,
to_char(log_time,'hh24')
HAVING ( count(*) > 100 )
AND count( *) > 0
ORDER BY count(*)
由于这是一个应用程序,因此听起来您需要与应用程序的作者合作来修复他们的括号用法。
<小时/>这是使用 DUAL 表的示例
之前,WHERE
和 HAVING
子句中的括号表达式格式错误。
SCOTT@dev> SELECT dummy,
2 COUNT(*)
3 FROM dual
4 WHERE (dummy != 'Y'
5 GROUP BY dummy
6 HAVING COUNT( *) = 1)
7 AND COUNT( *) > 0
8 ORDER BY COUNT(*)
9 /
WHERE (dummy != 'Y'
*
ERROR at line 4:
ORA-00907: missing right parenthesis
之后,更正了“WHERE”和“HAVING”子句中的括号表达式。
SCOTT@dev> --corrected
SCOTT@dev> SELECT dummy,
2 COUNT(*)
3 FROM dual
4 WHERE (dummy != 'Y')
5 GROUP BY dummy
6 HAVING (COUNT( *) = 1)
7 AND COUNT( *) > 0
8 ORDER BY COUNT(*)
9 /
D COUNT(*)
= ==========
X 1
关于oracle SQL 中的 ( ) 括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27826384/