zoukankan      html  css  js  c++  java
  • 联合查询时的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函数的说明全都来自网络上一个网友的原创博文,只是例子是笔者自己的,看了那个网友的博文以后,解决了笔者的实际问题,因此记录下来以备后查。在此对于那个网友表示衷心的谢意和歉意!

  • 相关阅读:
    AS3的内存泄漏与垃圾回收
    Unity序列化和持久化
    首发|创业3年半,做8款App全部扑街;转做公众号5个月,零成本吸粉12万还拿了百万天使轮
    为什么成功的人都不太要脸?
    浅谈2040年的职业环境应该是怎么样的?
    2040年的职业环境应该是怎么样的?
    潮汕牛肉火锅,美味在你身边
    要闻:2016胡润百富榜昨天发布 宝能姚振华从炸油条到千亿身家“大黑马”
    海报设计灵感:简约独特的图形图案排版 by Quim Marin
    摄影的基础美学详解
  • 原文地址:https://www.cnblogs.com/shouhuqingtian/p/2986498.html
Copyright © 2011-2022 走看看