Postgresql
簡化重複的 INSERT 命令,為未找到的值放置 NULL
我有許多用 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
碰巧是''
。(當然,子查詢不能返回多於一行,否則會引發異常。)
這簡化了您顯示的邏輯。我將不得不查看您的完整表定義、觸發器和触發器函式,以判斷該操作是否有意義。