COALESCE Vs OR NULL - PullRequest
       47

COALESCE Vs OR NULL

0 голосов
/ 11 июня 2019

Я хотел бы знать для моего сценария, если есть 2 таблицы:

работник: id, city, job_level

фильтры: city, job_level, some_val

У меня есть запрос вроде:

SELECT * 
FROM   employee e 
WHERE  NOT EXISTS(SELECT 1 
                  FROM   filters f 
                  WHERE  e.city = COALESCE(f.city, e.city) 
                         AND ( f.job_level IS NULL 
                                OR e.job_level = f.job_level )) 

Если вы видите, что условия для city и job_level работают одинаково. Тем не менее, я хотел бы знать, какой из них будет лучше. Кроме того, я хотел бы знать рекомендуемые индексы для этих таблиц для такого запроса.

1 Ответ

2 голосов
/ 11 июня 2019

Это не будет действительно иметь значение с точки зрения производительности. У вас есть сложное предложение WHERE, которое уже включает условие OR. Это в значительной степени исключает использование индекса.

Учитывая, что вы делаете с COALESCE(), я думаю, OR IS NULL яснее.

Если вы заботитесь о производительности, вы можете разделить это на несколько сравнений:

WHERE NOT EXISTS (SELECT 1 
                  FROM filters f 
                  WHERE e.city = f.city AND 
                        ( f.job_level IS NULL  OR e.job_level = f.job_level )
                 ) AND
      NOT EXISTS (SELECT 1 
                  FROM filters f 
                  WHERE f.city IS NULL AND 
                        ( f.job_level IS NULL  OR e.job_level = f.job_level )
                 ) 

Это может по крайней мере использовать индекс на filters(city, job_level).

...