Oracle фильтрация с несколькими существующими, но только один может оценить - PullRequest
1 голос
/ 14 апреля 2020

Пожалуйста, рассмотрите этот псевдо-запрос:

SELECT *
FROM A
WHERE 
   EXISTS (SELECT 1 FROM B WHERE B.ID = :ID)
   OR EXISTS (SELECT 1 FROM C WHERE C.NAME = :NAME)

Учтите, что:

  • "От А" намного сложнее, и я не хочу делать там больше соединений .
  • Я фильтрую результаты и запись foreach A Я просто хочу вернуть одну строку, поэтому у меня есть существующие в том порядке, в котором я хочу их оценить;

Как можно ли избежать запуска 2-го существующего (из-за производительности), если первый уже оценивает "true"?

Спасибо

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете использовать выражение case:

SELECT *
FROM A
WHERE 
    1 = CASE
        WHEN EXISTS (SELECT 1 FROM B WHERE B.ID = :ID) THEN 1
        WHEN EXISTS (SELECT 1 FROM C WHERE C.NAME = :NAME) THEN 1
    END

Это использует преимущества оценки короткого замыкания поведения case, которое описано в документация :

Для искомого выражения CASE база данных оценивает каждое условие, чтобы определить, является ли оно истинным, и никогда не оценивает условие, если предыдущее условие было истинным.

...