联合查询时的NULL值转换问题的解决
有两个不合理的数据表,一个表是原料表Material,一个表是库存表Stock,这两个表合并也不会有数据冗余。但是要在不改动这两个表基础上,解决一个问题。
问题是什么呢?先交代一下背景:
1、原料表是需要通过“基础信息录入”插入记录的,而库存表是通过“入库操作”插入记录的;
2、此外还有一个产品表,产品表通过一个产品明细表跟原材料表关联,产品ID与原材料ID是一对多的关系;
3、出库时通过选择一个产品ID,将该产品对应的原材料记录自动填充到出库明细中,这里使用了一个【视图】。
问题是:当一个产品里包含一个无库存的原材料,那么选择该产品时,那个无库存的原材料将不会被填充到出库明细中。
原因是:经过分析发现,无库存的原材料在【视图】中的库存表的原材料ID、库存表的库存ID、库存表的仓库ID、库存表的库存单价和库存表的库存数量都为NULL;而我在查询条件中用到这里的仓库ID,在结果使用上用到了这里的库存单价和库存数量;因此仓库ID为NULL的记录将不会出现在结果集中,进而导致产品中的原材料明细没有被全部填充到出库明细中。
解决办法是:使用ISNULL函数(初学者朋友注意,这里不是IS NULL,中间有一个空格的是判断值是否为空,而这个函数中间没有空格),对可能为NULL值的字段使用ISNULL函数并赋予设定值;如果在视图创建过程中,一定要为ISNULL函数结果设置一个列别名。
函数基本用法
功能:使用指定的替换值替换NULL。
语法:ISNULL(check_expression,replacement_value)。
参数:check_expression是被检测是否为NULL的表达式(包括字段),可以是任何类型;replacement_value是当check_expression为NULL时替换的值,replacement_value必须是能够隐式转换成check_expression类型的类型(见后面说明)。
返回值:如果check_expression为NULL,返回replacement_value值;如果check_expression不为NULL,则返回check_expression值。
说明:1、不要使用ISNULL函数查找NULL值;
2、当check_expression为NULL时,若replacement_value类型与check_expression类型不一致,看是否能隐式转换,如果能隐式转换,那么不报错且转换类型后返回值,如果不能隐式转换,那么执行SQL语句时直接报错
举例:前面提到的库存表库存数量为NULL,在视图查询语句中,我对库存数量列使用该函数,库存数量列的类型为int,当我将replacement_value值设为0,语句正常执行且返回0;当我设为'0'时,语句亦正常执行,但是返回0而不是'0';当我设为'a'时,语句终止执行并报错“类型无法隐式转换”(类似这个意思)。
最后,这个函数很简单,只是笔者不会,如果您也不会,那么可以多掌握一个基本知识点,如果您已经会了,那么以后遇到视图或者联合查询时,要记得对可能为NULL的列使用此函数。
鄙视自己一下,因为没打算发到博客园首页,所以没想到这篇文章还会被阅读。因此一个重要的问题没有说明,本篇涉及ISNULL函数的说明全都来自网络上一个网友的原创博文,只是例子是笔者自己的,看了那个网友的博文以后,解决了笔者的实际问题,因此记录下来以备后查。在此对于那个网友表示衷心的谢意和歉意!