报错ORA-00905: 缺失关键字 如何解决

写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

img

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;