Postgresql

簡化重複的 INSERT 命令,為未找到的值放置 NULL

  • August 23, 2022

我有許多用 PL/pgSQL 編寫的觸發函式,它們遵循以下邏輯:

SELECT my_name
INTO l_my_name
FROM data
WHERE data.my_number = NEW.test_num;

IF NOT FOUND THEN
  INSERT INTO test_event
  VALUES (NEW.test_num, NULL, NEW.event_one, NEW.event_two);
ELSE                                                                                            
  INSERT INTO test_event
  VALUES (NEW.test_num, l_my_name, NEW.event_one, NEW.event_two);
END IF;

一些插入具有超過 15 個以上的值,我試圖將它們簡化為僅 1 個插入,因為上面的程式碼一遍又一遍地重複儲存過程中的不同檢查,不必要地使過程有數百行程式碼長。我的想法是這樣的:

INSERT INTO test_event
VALUES (NEW.test_num, NULLIF(l_my_name,''), NEW.event_one, NEW.event_two);

我不確定如果沒有找到它是否l_my_name會正常工作,或者我是否必須做一些不同的事情。''``NULLIF

簡化為:

INSERT INTO test_event (col1, col2, col3, col4)  -- your actual column names ①
VALUES (NEW.test_num
     , (SELECT my_name FROM data WHERE data.my_number = NEW.test_num)  -- ②
     , NEW.event_one, NEW.event_two);

① 拼寫出目標列。在持久化程式碼中,這是非常可取的,否則它會在模式更改為 table 後靜默中斷text_event

② 如果data找到表中的行,data.my_name則插入。 子查詢中的“無行”被轉換為NULL- 正是您需要的。這裡不''涉及空字元串 () - 除非data.my_name碰巧是''

(當然,子查詢不能返回多於一行,否則會引發異常。)

這簡化了您顯示的邏輯。我將不得不查看您的完整表定義、觸發器和触發器函式,以判斷該操作是否有意義。

引用自:https://dba.stackexchange.com/questions/315948