Din arbejdsløsning er fin (og ligner den jeg har brugt før ). Hvis du kun vil binde én gang, kan du bruge en CTE eller inline-visning til at angive værdien til den rigtige forespørgsel:
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
Så der er kun én pladsholder at binde.
Jeg kan dog ikke se noget problem med en gren på Java-siden, medmindre din egentlige forespørgsel er meget mere kompliceret og ville føre til betydelig duplikering.