簡體   English   中英

觸發器:將新插入的列中的 null 值替換為同一行中的另一列值

[英]Trigger: Replace null values in column from new insert with another column value from SAME row

假設我有一個包含這些列的表:

PrimaryKey | Celsius (float) | Fahrenheit (float) | 

這兩個單位值可以相互轉換,但在任何給定時間,只有一個單位用於數據采集,這意味着另一個單位將記錄為 null。

我需要將新插入中記錄的 null 值轉換為記錄值的轉換,以便將這兩個值與條目一起存儲。

到目前為止,我得到了這樣的東西:

CREATE TRIGGER Temp_switch 
ON DATASET
FOR INSERT
AS    
    DECLARE @Temp_C float,
            @Temp_F float

    SET @Temp_C = (SELECT Temperature_C FROM inserted)
    SET @Temp_F = (SELECT Temperature_F FROM inserted)

BEGIN
    SET NOCOUNT ON

    UPDATE DATASET
    SET DATASET.Temperature_F = (@Temp_C * 1.8) + 32
    FROM DATASET 
    INNER JOIN inserted ON DATASET.DatasetId = inserted.DatasetId
    WHERE @Temp_F IS NULL

    UPDATE DATASET
    SET DATASET.Temperature_C = (@Temp_F - 32)/1.8
    FROM DATASET 
    INNER JOIN inserted ON DATASET.DatasetId = inserted.DatasetId
    WHERE @Temp_C IS NULL
END

然后我嘗試了使用 Coalesce 的東西:

CREATE TRIGGER Temp_switch ON DATASET
FOR INSERT
AS
BEGIN
    UPDATE DATASET
        SET Temperature_F = COALESCE(i.Temperature_F, (i.Temperature_C * 1.8) + 32),
            Temperature_C = COALESCE(i.Temperature_C, (i.Temperature_C - 32) / 1.8)
        FROM DATASET d INNER JOIN
             inserted i
             ON d.DatasetId = i.DatasetId
        WHERE i.Temperature_F IS NULL OR i.Temperature_C IS NULL;
END;

當單位為攝氏度時,這兩個都填充了 Temperature_F 列,但是所有的 Temperature_F 值都是相同的,就好像它們都從插入的行中獲取相同的攝氏度參考值一樣——每個條目都應該改變,因為存儲的向 DATASET 表輸入數據的過程一次只添加一行。 我留下了一些看起來像這樣的東西(虛構的例子):

 SessionId | Celsius (float) | Fahrenheit (float) | 
         3 |         22.0    |              84.00 |
         3 |         24.5    |              84.00 | 
         3 |         23.0    |              84.00 | 
         3 |         25.5    |              84.00 | 
         3 |         23.0    |              84.00 |  

所以我需要一些可以從同一插入行引用攝氏或華氏值的東西,並根據該值計算另一列。 有任何想法嗎?

觸發器中有一個錯字:

CREATE TRIGGER Temp_switch ON DATASET
FOR INSERT
AS
BEGIN
    UPDATE DATASET
        SET Temperature_F = COALESCE(i.Temperature_F, (i.Temperature_C * 1.8) + 32),
            Temperature_C = COALESCE(i.Temperature_C, (i.Temperature_F - 32) / 1.8)
---------------------------------------------------------^
        FROM DATASET d INNER JOIN
             inserted i
             ON d.DatasetId = i.DatasetId
        WHERE i.Temperature_F IS NULL OR i.Temperature_C IS NULL;
END;

我認為問題在於之前的觸發器沒有被刪除。 但這里有一個db<>fiddle表明它有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM