Giải pháp hoạt động của bạn ổn (và tương tự như giải pháp tôi đã sử dụng trước đây ). Nếu bạn chỉ muốn liên kết một lần, bạn có thể sử dụng CTE hoặc chế độ xem nội tuyến để cung cấp giá trị cho truy vấn thực:
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
Vì vậy, chỉ có một trình giữ chỗ để liên kết.
Mặc dù vậy, tôi thực sự không thấy có vấn đề gì với một nhánh bên Java, trừ khi truy vấn thực tế của bạn phức tạp hơn nhiều và sẽ dẫn đến trùng lặp đáng kể.