2014-01-10 2 views
0

Я разрабатываю на MS SQL Server 2008.Как использовать результат встроенной функции SQL дважды в одном запросе?

Я работаю с SQL запросом написан другим разработчиком с сазе, который выглядит следующим образом:

CASE 
    WHEN substring(A,4,3) is null THEN '????' 
    WHEN substring(A,4,3) in ('000','010','018') THEN '100L' 
    WHEN substring(A,4,3) = '123' AND substring(A,8,3) = 'abc' THEN 'FOO' 
END 

Моя мысль в том, что ему является избыточным, чтобы использовать substring(A,4,3), и там должен быть какой-то способ избежать этого.

Как я могу переписать этот пункт, вызывая substring(A,4,3) только один раз?

+1

Это не является допустимым заявление случае, третий 'WHEN' имеет соответствующего' затем'. – RedFilter

+0

@RedFilter, я исправил это! Я обработал некоторую конфиденциальную информацию из запроса и случайно сделал ее недействительной. –

+0

Нет разницы в производительности. Двигатель фактически не выполняет это 3 раза. Оптимизатор должен будет выполнить это только один раз. Нет смысла оптимизировать этот оператор. Любая альтернатива этому только сделает ваш код менее удобочитаемым. –

ответ

0

Вы могли бы сделать что-то вроде этого:

select case 
     when substr1 is null 
      then '????' 
     when substr1 in ('000', '010', '018') 
      then '100L' 
     when substr1 = '123' 
      and substring(A, 8, 3) = 'abc' 
      then 'xxx' 
     end 
from (
    select substring(A, 4, 3) as substr1 from MyTable 
    ) a 
+0

Я собирался опубликовать то же самое, а затем задался вопросом, будет ли конечный результат таким же, как только оптимизатор sql обработает запрос. –

+0

Более крупный запрос, содержащий этот оператор CASE, уже находится в подзапросе, поэтому я надеялся избежать написания подзапроса. Мне также было интересно, можно ли оптимизировать это повторение, как вы полагаете. –

+0

Вы можете использовать подзапросы, таблицы cte или temp, если вы беспокоитесь о необходимости повторять это снова, но оптимизация этой части не повлияет на производительность. –

Смежные вопросы