作者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://webptt.com/cn.aspx?n=bbs/Database/M.1485229543.A.395.html
※ 编辑: hirabbitt (211.75.101.50), 01/24/2017 11:46:23
1F:推 streetbad: ISNULL(PARM1,'')将栏位先转成只有有值或是'' 01/24 11:48
2F:→ streetbad: 然後接@parm1之後可以先做处理 if @parm1 is null 01/24 11:49
3F:→ streetbad: set @parm1 = '' 类似的方式 01/24 11:49
4F:→ streetbad: 这样後面的主查询指令就不会落落长了 01/24 11:49
5F:→ hirabbitt: 喔~ 太感谢了!! 01/24 11:53
6F:推 cutekid: isnull(PARM1,'') = isnull(@parm1,'') and 01/24 15:10
7F:→ cutekid: isnull(PARM2,'') = isnull(@parm2,'') and 01/24 15:10
8F:→ cutekid: ... 以此类推 01/24 15:11
9F:→ hirabbitt: 喔喔!! 喜欢这种写法 01/24 15:19