Oracle
 sql >> Database >  >> RDS >> Oracle

PreparedStatement è null nella clausola Where senza valori if condizionali (query dinamiche) o senza senso

La tua soluzione di lavoro va bene (e simile a quella che ho usato prima ). Se desideri eseguire il binding solo una volta, puoi utilizzare una visualizzazione CTE o inline per fornire il valore alla query reale:

WITH CTE AS (
    SELECT ? AS REAL_VALUE FROM DUAL
)
SELECT C.*   -- but not * really, list all the columns
FROM CTE
JOIN CUSTOMERS C
ON (CTE.REAL_VALUE IS NULL AND C.CUSTOMER_ID IS NULL)
    OR C.CUSTOMER_ID = CTE.REAL_VALUE

Quindi c'è solo un segnaposto da associare.

Tuttavia, non vedo alcun problema con un ramo sul lato Java, a meno che la tua query effettiva non sia molto più complicata e comporti una duplicazione significativa.