Limpiando un poco la sintaxis de esa query tenemos:
Código SQL:
Ver originalSELECT C_Invoice.C_Invoice_ID, NULL, C_Invoice.DocumentNo, C_Invoice.IsActive, XX_NRO_COMPROBANTE, XX_NRO_COMPROBANTEISLR
FROM C_Invoice
WHERE C_Invoice.DocumentNo IS NOT NULL
AND C_Invoice.IsSoTrx = 'N'
AND C_Invoice.AD_Client_ID IN (0, 1000000)
AND C_Invoice.DocStatus IN ('VO', 'RE')
AND (CASE '@XX_TipoRetencion@'
WHEN 'IV'
THEN XX_NRO_COMPROBANTE IS NOT NULL
AND XX_NRO_COMPROBANTE <> ' '
WHEN 'IS'
THEN XX_NRO_COMPROBANTEISLR IS NOT NULL
AND XX_NRO_COMPROBANTEISLR <> ' '
END
)
ORDER BY C_Invoice.DocumentNo DESC
Ahora bien, dentro de Oracle, a mi entender (que me corrijan los que tienen más experiencia), no tiene sentido usar CASE en el WHERE porque sólo aplica:
1) En PL/SQL, como controladore de flujo del programa PL, para ejecutar una sentencia en una alternativa.
2) En una sentencia, para devolver un valor a una columna, si el resultado de la comparación (booleano) es TRUE o FALSE.
Ninguna de esas premisas se cumple en ese caso.
Me parece que lo que quieres lograr en Oracle se hace de otras formas. TYal vez lo que quieras sea algo como lo que se realiza con la
cláusula WITH, por ejemplo.
De lo contrario, te recomiendo leer algo de
selects condicionales, en Oracle. Tal vez te ayude.