SQL Server ссылается на вычисляемый столбец - PullRequest
26 голосов
/ 05 января 2009

У меня есть оператор выбора с вычисляемыми столбцами, и я хотел бы использовать значение одного вычисляемого столбца в другом. Это возможно? Вот надуманный пример, показывающий, что я пытаюсь сделать.

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25

Ответы [ 6 ]

21 голосов
/ 05 января 2009

номер

Все результаты одной строки из выбора являются атомарными. То есть вы можете просматривать их все так, как будто они происходят параллельно и не могут зависеть друг от друга.

Если вы имеете в виду вычисляемые столбцы, вам нужно обновить ввод формулы, чтобы результат изменился во время выбора.

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

Например, эти столбцы всегда будут идентичны:

-- assume that 'Calc' is a computed column equal to Salaray*.25
SELECT Calc, Salary*.25 Calc2 FROM YourTable

Также имейте в виду, что опция persisted ничего не меняет. Он сохраняет значение, которое хорошо для индексации, но атомарность не меняется.

11 голосов
/ 05 января 2009

К сожалению, не совсем, но обходной путь, который иногда стоит это

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
3 голосов
/ 22 августа 2015

Да, это возможно.

Используйте оператор WITH для вложенных выборок:

3 голосов
/ 05 января 2009

Есть два способа сделать это. Сначала поймите, что столбец calval1 не существует в том, что касается SQL Server, до тех пор, пока не выполнится инструкция, поэтому он не может быть напрямую использован для демонстрации вашего примера. Таким образом, вы можете поместить это вычисление дважды, один раз для calval1 и один раз в качестве замены для calcval1 в расчете calval2. Другой способ - создать производную таблицу с calval1 в ней, а затем вычислить calval2 вне производной таблицы примерно так:

select calcval1*.25 as calval2, calval1, field1, field2
from (select casestament as cavlval1, field1, field2 from my table) a

Вам нужно будет протестировать и то, и другое.

2 голосов
/ 20 ноября 2012

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

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
0 голосов
/ 05 января 2009

Вы не можете "сбросить" значение вычисляемого столбца в предложении Select, если это то, что вы пытаетесь сделать ... Значение вычисляемого столбца основано на формулах вычисляемого столбца. Который МОЖЕТ включать значение другого вычисляемого столбца .... но вы не можете сбросить формулы в предложении Select ... если все, что вы хотите сделать, это "вывести" значение на основе двух вычисляемых столбцов (как синтаксис Вопрос гласит: «Тогда "[Calcval2]"
в

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 

просто станет псевдонимом столбца при выводе предложения Select.

или вы спрашиваете, как определить формулы для одного вычисляемого столбца, основанные на другом?

...