第一次詢問,若表達的不好,非常抱歉。
大家好,最近在調整Trigger遇到些問題
目前狀況是,當某張表有做修改或新增
Trigger會自動寫入log
但因為這張表會頻繁的做全刪再全增的動作
導致大量的相同資料會一直存進log
需求是希望做到在存進log時先判斷如果欄位沒變就別新增
做法是先select log表裡最新的資料判斷欄位有沒有變
如果select出的表有值就代表有一樣的資料所以不新增,沒有值就新增。
目前遇到的問題是,這張表的欄位有可能是null
我的語法如下
select * from logTable
where 欄位=表的欄位變數
這個變數如果輸入null值
select * from logTable
where 欄位=null
就會select不出東西,導致就算資料沒變還是會寫進log
目前知道null的話得用 is null判斷
但偏偏欄位有可能是字串
請問在sql要如何達成這樣的寫法呢?
先判斷表的欄位變數是null的話
使用 where 欄位is null
欄位變數是字串的話
使用 where 欄位 =變數
或是有更好的辦法可以提供,謝謝
統一空字串比對~
declare @Str nvarchar(50) = null
select *
from logTable
where isNull(欄位,'') = isNull(@Str,'')
= null 改成 IS NULL
<> null 要用 IS NOT NULL
如果還有其他條件就看情況用 OR 或是 AND
譬如這樣
SELECT xxx FROM ooo WHERE `name` IS NULL OR `name` = '';
之類的.
IN沒有試過,
不確定可不可以,
感覺可能是不行.
如果需求是這樣,我是會這樣寫
WHERE ISNULL([欄位],'@@@@') = ISNULL('搜尋值', '@@@@')
'@@@@' 可以替換 概念是這樣
SELECT *
FROM logTable
WHERE ISNULL('更新欄位','') <> ''
AND ISNULL(欄位,'') <> ISNULL('更新欄位','')
INSERT INTO logTable
SELECT xxx,xxx,xxx,xxx FROM logTable WHERE NOT EXSIT (select 1 from logTable where isNull([欄位],'') = isNull(@Str,''))
NOT EXSIT 大致上是說不存在 ,才 INSERT
所以,您可以使用值存不存在,就知道是否變更了
值在=>表示沒有變更
值不在=>表示有變更
另外 isNull([欄位],'') ==>SQL Server
NVL([欄位],'') ==> Oracle
至於My SQL 、MongoDB、pgAdmin ...
不是很清楚~
Trigger==>會影響原本的表格INSERT、UPDATE、DELETE 速度(量大的時候)
有試過用MERGE語法嗎
這樣就可以不用全刪再全增了
大概是這樣
MERGE INTO #TEMP1 --要新增修改的表
USING #TEMP2 --參考的表
ON #TEMP1.欄位 = #TEMP2.欄位 --條件
WHEN MATCHED THEN --當條件符合時
UPDATE SET #TEMP1.欄位=#TEMP2.欄位
WHEN NOT MATCHED THEN --條件不符合時
INSERT VALUE(#TEMP2.欄位)
然後NULL或空字串則是用ISNULL判斷
ISNULL(欄位,'')=''
可以搜尋一些文章看看
https://docs.microsoft.com/zh-tw/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
不確定你的資料庫是哪一種
以 MS SQL為例
SELECT *
FROM TABLE
WHERE COALESCE(欄位,'') = ''
DOCS 上有更多用法
COALESCE (Transact-SQL)