Избегайте двойных вычислений в предложениях SELECT и WHERE - PullRequest
0 голосов
/ 20 июня 2019

Предположим, у меня есть таблица myTable с двумя столбцами: id и value.У меня также есть функция с именем someFunction, которая вычисляет что-то на основе идентификатора myTable.Теперь, если я хочу выбрать записи, у которых результат функции меньше 100, а также отобразить результат функции, как я могу это сделать?

Этот запрос выглядит нормально, но не выполняет ли он вычисление одного и того же дважды- в предложении WHERE, а затем в предложении SELECT?

   SELECT dbo.someFunction(mt.id, date), mt.id
   FROM myTable mt
   WHERE dbo.someFunction(mt.id, date) < 100

Есть ли способ переписать его на что-то вроде этого псевдокода:

   SELECT 'RESULT', mt.id
   FROM myTable mt
   WHERE dbo.someFunction(mt.id, date) < 100 as 'RESULT'

Ответы [ 2 ]

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

Один метод использует apply:

SELECT v.funval, mt.id
FROM myTable mt CROSS APPLY
     (VALUES (dbo.someFunction(mt.id, date)) v(funcval)
WHERE funcval < 100;

SQL Server должен оценить это только один раз.

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

Да, если дважды использовать функцию в запросе, функция будет вызываться дважды, вы можете просто использовать подзапрос, чтобы избежать вызова функции дважды, что-то вроде этого ...

SELECT mt.*
FROM (
        SELECT dbo.someFunction(id, date) AS RESULT, id
        FROM myTable
    ) mt
WHERE mt.RESULT < 100
...