Uw werkende oplossing is prima (en vergelijkbaar met wat ik eerder heb gebruikt ). Als u slechts één keer wilt binden, kunt u een CTE of inline-weergave gebruiken om de waarde aan de echte query te geven:
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
Er is dus maar één tijdelijke aanduiding om te binden.
Ik zie echter niet echt een probleem met een branch aan de Java-kant, tenzij je eigenlijke vraag veel gecompliceerder is en tot aanzienlijke duplicatie zou leiden.