Вопрос

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

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
Это было полезно?

Решение

Нет.

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top