写sql时遇到下面的问题请求援助
报错 ORA-00905: 缺失关键字
ORA-00905: 缺失关键字
SELECT
NODE_NAME,
SUM( NODE_CONFIRM_VALUE ) TOTAL
FROM
MATB_EQ_NODE_CONFORM
WHERE
SHIFT_DETAIL_ID IS NULL
AND
CASE
LENGTH( '2022' )
WHEN 4 THEN
TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) )
AND TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
WHEN 7 THEN
TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01', 'yyyy-MM' ) )
AND TRUNC( TO_DATE( '2024-01', 'yyyy-MM' ) )
ELSE TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) )
AND TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
END
GROUP BY
NODE_NAME
SELECT
NODE_NAME,
SUM( NODE_CONFIRM_VALUE ) TOTAL
FROM
MATB_EQ_NODE_CONFORM
WHERE
SHIFT_DETAIL_ID IS NULL
AND TRUNC( BALANCE_DATE ) >=
(CASE
LENGTH( '2022' )
WHEN 4 THEN
TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) )
WHEN 7 THEN
TRUNC( TO_DATE( '2022-01', 'yyyy-MM' ) )
ELSE
TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) )
END )
AND TRUNC( BALANCE_DATE ) <=
(CASE
LENGTH( '2022' )
WHEN 4 THEN
TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
WHEN 7 THEN
TRUNC( TO_DATE( '2024-01', 'yyyy-MM' ) )
ELSE
TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
END )
GROUP BY
NODE_NAME
1、WHERE中的CASE WHEN后面似乎不能接比较复杂的表达式,简化了两次都不行,只能去掉 CASE WHEN 语句了:
WITH MATB_EQ_NODE_CONFORM AS (
SELECT '111' node_name, to_date( '2023', 'yyyy' ) BALANCE_DATE, 1 node_confirm_value, NULL SHIFT_DETAIL_ID FROM dual )
SELECT NODE_NAME, SUM( NODE_CONFIRM_VALUE ) TOTAL
FROM MATB_EQ_NODE_CONFORM
WHERE SHIFT_DETAIL_ID IS NULL
AND /*( CASE LENGTH( '2022' ) -- 原SQL:缺失关键字
WHEN 4 THEN
TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) ) AND TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
WHEN 7 THEN
TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01', 'yyyy-MM' ) ) AND TRUNC( TO_DATE( '2024-01', 'yyyy-MM' ) )
ELSE
TRUNC( BALANCE_DATE ) BETWEEN TRUNC( TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) ) AND TRUNC( TO_DATE( '2024-01-01', 'yyyy-MM-dd' ) )
END ) */
-- 简化1:仍然缺失关键字
-- ( CASE WHEN LENGTH( '2022' ) = 4 THEN BALANCE_DATE >= TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) END )
-- 简化2:缺失右括号
-- ( CASE WHEN LENGTH( '2022' ) = 4 THEN ( BALANCE_DATE >= TO_DATE( '2022-01-01', 'yyyy-MM-dd' ) ) END )
-- 同义化1:去掉 CASE WHEN
/* TRUNC( BALANCE_DATE ) BETWEEN to_date( SUBSTR( '2022' || '-01-01', 1, 10 ), 'yyyy-MM-dd' )
AND to_date( SUBSTR( '2024' || '-01-01', 1, 10 ), 'yyyy-MM-dd' ) */
-- 同义化2:去掉 CASE WHEN,如果 BALANCE_DATE 上有索引,不要在该字段上使用函数,除非你建立了 trunc( BALANCE_DATE ) 的函数索引
BALANCE_DATE BETWEEN to_date( SUBSTR( '2022' || '-01-01', 1, 10 ), 'yyyy-MM-dd' )
AND to_timestamp( SUBSTR( '2024' || '-01-01', 1, 10 ) || ' 23:59:59.999999', 'yyyy-MM-dd hh24:mi:ss.ff' ) -- 最后一天是包含到0点还是全天,需要根据具体业务来限定
GROUP BY NODE_NAME;
这里姜老师把--into sp_sum_fee注释掉后就正常了