Использовать значение столбца для другого столбца (SQL Server)?

позволяет сказать, что у меня огромный выбор на определенной таблице. Одно значение для столбца вычисляется с помощью сложного logc и его называется ColumnA. Теперь для другого столбца мне нужно значение из ColumnA и добавить к нему другое статическое значение.

Пример SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

[ColumnA] + 10 - это то, что нужно искать. Сложный материал - это огромный случай/когда блок.

Идеи?

Ответы

Ответ 1

Если вы хотите ссылаться на значение, вычисленное в предложении SELECT, вам нужно переместить существующий запрос в sub-SELECT:

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

Вы должны ввести псевдоним для этой таблицы (выше, t, после закрывающей скобки), даже если вы не собираетесь использовать его.

(Эквивалентно - если вы используете SQL Server 2005 или более позднюю версию, вы можете переместить существующий запрос в CTE):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults

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

Ответ 2

Вы можете решить это с помощью подзапросов и псевдонимов столбцов.

Вот пример:

SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId

Ответ 3

Вы можете:

  • Сделайте + 10 в клиентском коде
  • Напишите скалярнозначную функцию для инкапсуляции логики для complex stuff. Он будет оптимизирован в один вызов.
  • Скопировать complex stuff логику для другого столбца. Он должен быть оптимизирован в 1 вызов.
  • Используйте дополнительный выбор для применения дополнительного расчета

Ответ 4

К сожалению, в SQL Server 2016:

SELECT 3 AS a, 6/a AS b;

Ошибка: неверное имя столбца: "a".