我在位置上看到了一个ORA-00905: missing keyword at
错误: 181,似乎找不出SQL (Oracle /SQL)的错误所在。
SELECT *
FROM FOO
WHERE LOCATION = :LOCATION
AND SAVED_DATE >= CASE WHEN :BEGIN_D IS NULL THEN SAVED_DATE ELSE TIMESTAMP :BEGIN_D END
AND SAVED_DATE <= CASE WHEN :END_D IS NULL THEN SYSDATE ELSE TIMESTAMP :END_D END
ORDER BY SAVED_DATE;
我的假设是,在事件发生时,用户输入是:
:LOCATION = 'new york'
:BEGIN_D = NULL
:END_D = NULL
然后推导出以下查询:
SELECT *
FROM FOO
WHERE LOCATION = 'new york'
AND SAVED_DATE >= SAVED_DATE -- This line is ignored
AND SAVED_DATE <= SYSDATE
ORDER BY SAVED_DATE;
不过,我在一开始就看到了提到的错误。
当输入不是NULL
(Ex::BEGIN_D = '2015-12-01 00:01:44'
)时,我不会看到错误。如果:BEGIN_D
和:END_D
要么是NULL
,要么两者都是NULL
,则错误将返回。
发布于 2022-03-26 00:20:46
绑定变量不是替代变量;它们没有被您输入的文本替换,因此不能使用TIMESTAMP :BEGIN_D
。您只需要使用:BEGIN_D
并传入TIMESTAMP
数据类型。
SELECT *
FROM FOO
WHERE LOCATION = :LOCATION
AND SAVED_DATE >= CASE WHEN :BEGIN_D IS NULL THEN SAVED_DATE ELSE :BEGIN_D END
AND SAVED_DATE <= CASE WHEN :END_D IS NULL THEN SYSDATE ELSE :END_D END
ORDER BY SAVED_DATE;
您还不需要使用CASE
表达式:
SELECT *
FROM FOO
WHERE LOCATION = :LOCATION
AND (:BEGIN_D IS NULL OR SAVED_DATE >= :BEGIN_D)
AND ((:END_D IS NULL AND SAVED_DATE <= SYSDATE) OR SAVED_DATE <= :END_D)
ORDER BY SAVED_DATE;
如果要传入字符串值(而不是时间戳),则使用TO_DATE
SELECT *
FROM FOO
WHERE LOCATION = :LOCATION
AND (:BEGIN_D IS NULL OR SAVED_DATE >= TO_DATE(:BEGIN_D, 'YYYY-MM-DD HH24:MI:SS'))
AND ((:END_D IS NULL AND SAVED_DATE <= SYSDATE) OR SAVED_DATE <= TO_DATE(:END_D, 'YYYY-MM-DD HH24:MI:SS'))
ORDER BY SAVED_DATE;
https://stackoverflow.com/questions/71624345
复制相似问题