2014-02-05 5 views
0

Возможно ли иметь столбец в таблице (не из представления) (SQL SERVER 2008) для изменения в соответствии со значением в другом столбце, то есть, если у меня есть столбец с именем «DUEDATE», я могу есть столбец под названием «STATUS», который изменит статус на «Now Due», если «DUEDATE» -> GetDate()? Если да, то как вы добавляете это в таблицу?Использование оператора CASE в таблице

+1

В лучшей практике мы не храним столбцы, которые могут быть получены из другого. – Miller

+0

Я понимаю, но я создал представление, но это делает мой весь запрос настолько медленным, когда я добавляю таблицу LEFT JOINED с этим представлением. –

+1

Зачем вам нужно добавить таблицу LEFT JOINED в представление? Просто создайте представление, содержащее все столбцы из базовой таблицы, и добавьте оператор CASE, как в моем ответе ниже. – Dan

ответ

0

Да, вы можете создать вычисляемый столбец:

CREATE TABLE [dbo].[SampleTable](
    [DueDate] [date] NULL, 
    [ComputedValue] AS (CASE WHEN [Duedate] > GETDATE() THEN 'Now Due' ELSE '' END) 
) ON [PRIMARY] 

Как это недетерминирована столбец (из-за стоимости GETDATE(), который отличается каждый раз, когда вы используете таблицу), добавив его к таблица не дает вам большой пользы от того, чтобы вернуть то же самое в выбранном запросе.

0

Вы можете изменить таблицу и добавить вычисляемый столбец:

ALTER TABLE dbo.TheTable 
ADD Status AS CASE WHEN ... 

Вы не можете сохраняться, потому что это не детерминированным, поэтому не добавляйте PERSISTED или попытаться поставить индекс на нем.

С точки зрения индексирования не пытайтесь запросить его, используя WHERE Status = 'whatever', потому что ему придется рассматривать каждую строку в таблице. Вместо этого используйте индекс для DueDate и WHERE DueDate < = GETDATE()

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