作者hirabbitt (兔子)
看板Database
標題[SQL ] NILL和''判斷
時間Tue Jan 24 11:45:39 2017
資料庫名稱:MSSQL
資料庫版本:2012
內容/問題描述:
在做一個找資料的function F1
ALTER FUNCTION F1(
@parm1 varchar(9),
@parm2 varchar(9)
)
中略
SELECT 1 FROM T WHERE
PARM1 = @parm1 and
PARM2 = @parm2
後略
但是後來發現PARM1和PARM2中有''也有NULL
而前端傳來的@parm1和@parm2也不保證不會有人刻意把''處理成DBNull.Value
所以WHERE條件變成
(PARM1 = @parm1 or
PARM1 is null and @parm1 = '' or
PARM1 = '' and @parm1 is null or
PARM1 is null and @parm1 is null) and
(PARM2 = @parm2 or
PARM2 is null and @parm2 = '' or
PARM2 = '' and @parm2 is null or
PARM2 is null and @parm2 is null)
然後其實變數是PARM1~到PARM11
整串變得超級長
我想說中間重覆的部份可以寫成一個FUNCTION
ALTER FUNCTION F2
(
@str1 varchar(MAX) = null,
@str2 varchar(MAX) = null
)
RETURNS bit
AS
BEGIN
RETURN CAST (
CASE WHEN
@str1 = @str2 or
@str1 is null and @str2 = '' or
@str1 = '' and @str1 is null or
@str1 is null and @str2 is null
THEN 1
ELSE 0
END
as bit)
END
然後腦袋就卡住了
直覺在F1中call F2就不是個好方法
請問有什麼別的解嗎感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.75.101.50
※ 文章網址: https://www.ptt.cc/bbs/Database/M.1485229543.A.395.html
※ 編輯: hirabbitt (211.75.101.50), 01/24/2017 11:46:23
推 streetbad: ISNULL(PARM1,'')將欄位先轉成只有有值或是'' 01/24 11:48
→ streetbad: 然後接@parm1之後可以先做處理 if @parm1 is null 01/24 11:49
→ streetbad: set @parm1 = '' 類似的方式 01/24 11:49
→ streetbad: 這樣後面的主查詢指令就不會落落長了 01/24 11:49
→ hirabbitt: 喔~ 太感謝了!! 01/24 11:53
推 cutekid: isnull(PARM1,'') = isnull(@parm1,'') and 01/24 15:10
→ cutekid: isnull(PARM2,'') = isnull(@parm2,'') and 01/24 15:10
→ cutekid: ... 以此類推 01/24 15:11
→ hirabbitt: 喔喔!! 喜歡這種寫法 01/24 15:19