Подтвердить что ты не робот

Справочник SQL Server Расчетный столбец

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

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

Ответ 1

Нет.

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

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

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

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

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

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

Ответ 2

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

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)

Ответ 3

Два способа, я могу думать об этом. Сначала убедитесь, что столбец 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

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

Ответ 4

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

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

Ответ 5

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

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V

Ответ 6

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

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

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

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