Twoje rozwiązanie robocze jest w porządku (i podobne do tego, którego używałem wcześniej ). Jeśli chcesz powiązać tylko raz, możesz użyć widoku CTE lub wbudowanego, aby podać wartość rzeczywistemu zapytaniu:
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
Jest więc tylko jeden symbol zastępczy do powiązania.
Jednak naprawdę nie widzę problemu z gałęzią po stronie Javy, chyba że twoje rzeczywiste zapytanie jest znacznie bardziej skomplikowane i prowadziłoby do znacznego powielania.