Вашето работещо решение е наред (и подобно на това, което използвах преди ). Ако искате да обвържете само веднъж, можете да използвате CTE или вграден изглед, за да предоставите стойността на истинската заявка:
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
Така че има само един заместител за обвързване.
Наистина не виждам проблем с клон от страна на Java обаче, освен ако действителната ви заявка не е много по-сложна и би довела до значително дублиране.