2014-02-05 37 views
0

是否有可能在表中有一列(而不是從視圖)(SQL SERVER 2008)根據另一列中的值進行更改,即如果我有一列名爲「DUEDATE」的列,我可以有一個名爲「STATUS」的列,如果「DUEDATE」> GetDate(),它會將狀態更改爲「Now Due」。如果是的話,你如何將它添加到表格中?在表中使用CASE語句

+1

在最佳實踐中,我們不保留可從另一個派生的列。 – Miller

+0

我明白了,但我已經創建了一個視圖,但當我添加與該視圖左連接的表時,它使得我的整個查詢非常慢。 –

+1

爲什麼您需要將表格添加到視圖?只需創建一個包含基表中所有列的視圖,並添加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()