2010-09-07 40 views
2

我對更高級的數據庫功能(例如函數)相當陌生,但我很好奇你將如何在MSSQL中執行此操作(或者如果它是可能的,即使):SQL Server 2008字段功能 - 根據兩個其他字段之間的關係返回'ok'或'no'

如果我有一個表,結構是這樣的:

 
t_test 

USR_VALUE MULTIPLIER TOLERANCE VALUE_OK 
100   .8   85   OK   
100   .9   85   NO 

我怎麼會得到VALUE_OK每一個依賴於該行被更新時自動更新USR_VALUE,MULTIPLIER和TOLERANCE(IE簡單計算: (t_test.USR_VALUE * t_test.MULTIPLIER >= TOLERENCE)? "OK" : "NO"

+0

當你說「AUTOMA tic更新'你的意思是說,任何插入/更新應透明地執行此操作? – 2010-09-07 23:18:47

+0

在插入過程中或查詢時。 – Brian 2010-09-07 23:52:47

回答

4

你想表達:

CASE 
    WHEN USR_VALUE * MULTIPLIER >= TOLERANCE THEN 'OK' 
    ELSE 'NO' 
END 

注意,您可以爲使用計算列在表中添加這...

ALTER TABLE yourtable 
ADD VALUE_OK AS  CASE 
         WHEN USR_VALUE * MULTIPLIER >= TOLERANCE THEN 'OK' 
         ELSE 'NO' 
        END 

...但要注意不能使用這個值WHERE子句中執行計算和缺乏索引的成本可能會過高。搜索索引計算的列,如果你想把它帶到下一個級別。

+0

這太神奇了!謝謝。任何可能的方式,我可以讓你添加第一個條件,檢查是否任何字段爲NULL,然後返回(空字符串)? – Brian 2010-09-07 23:50:27

+1

當然 - 在CASE語句之後,您會添加'WHER USR_VALUE爲NULL或MULTIPLIER爲NULL''。 – 2010-09-07 23:57:15

+1

另一個選項可以讓您將列索引爲更快的查詢,是一個插入/更新觸發器。當值改變時,重新計算規則並堅持結果。無論你是做這個還是一個計算列,取決於你是否正在閱讀或寫作更多。 – KeithS 2010-09-08 00:01:42

0

其實我所用的代碼並修改它了一點,所以它結束了類似於威爾的東西,但現在我可以在其他領域/表使用它(創建函數):

CREATE FUNCTION [dbo].[is_ok](@Number1 float, @Number2 float, @Tolerence float) 
RETURNS varchar(5) 
AS 
BEGIN 
    DECLARE @RETURN varchar(5), @RESULT float; 
    SET @RESULT = @Number1 * @Number2; 
    IF @Number1 is NULL OR @Number2 is NULL 
     SET @RETURN = ''; 
    ELSE IF @RESULT >= @Tolerence 
     SET @RETURN = 'OK'; 
    ELSE 
     SET @RETURN = 'NO'; 
    RETURN @RETURN; 
END; 

然後加入新列:

ALTER TABLE t_test ADD [value_ok] AS ([dbo].[is_ok]([user_value],[multiplier],[tolerance])); 

(這應該工作,但我沒有從我所用的測試數據庫複製和修改字段名稱相匹配的問題的示例表)

相關問題