SQL语句中null的应用。

来源:互联网 发布:新会人民法院 淘宝拍卖 编辑:程序博客网 时间:2024/05/23 19:19

首先推荐一下深入详解SQL中的null(http://blog.csdn.net/renfufei/article/details/44420539) 这篇文章写得比较全面了。

这里我说一下我遇到的问题。

在设计一个存储过程时,我们经常把一个变量查询出来之后,放入一个变量中。

标准做法是,先select 数据赋值给变量。然后再判断变量是否为空。(如果事情到这里,没有问题了。)

当时为了偷懒直接使用了一些函数来处理null。eg:isnull之类的函数。测试过程中发现没有解决问题。

于是我开始了查找问题,先怀疑数据库,再怀疑接口等等等。

结果我在反复调查求证之后,发现由于where条件是false。所以没有结果。进而我在select部分中加的所有函数都无效了。

这就是【结果是空集】与【集合中有一个对象,对象为空集】经典的集合问题了

样例表:

-- ----------------------------
-- Table structure for `test`
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `TEST_I` int(11) DEFAULT NULL,
  `TEST_C` varchar(512) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

样例数据:

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'a');
INSERT INTO `test` VALUES ('2', 'b');

样例存储过程(版本1):

DROP PROCEDURE IF EXISTS `PROCEDURE_TEST`;
CREATE  PROCEDURE `PROCEDURE_TEST`(
    _TEST_I int(11) ,
    _TEST_C VARCHAR(512)
)
BEGIN
DECLARE _TEST_I_EX int;
SELECT  TEST_I INTO _TEST_I_EX FROM TEST WHERE TEST_I = _TEST_I ;
 IF _TEST_I <> _TEST_I_EX THEN
INSERT INTO TEST(
    TEST_I,
    TEST_C
    )
    VALUES(
    _TEST_I,
    _TEST_C
    );
    END IF ;
END;

我立刻判断出来_TEST_I_EX是null引发的问题。于是写了第二个版本的存储过程。

样例存储过程(版本2改进版):

DROP PROCEDURE IF EXISTS `PROCEDURE_TEST`;
CREATE  PROCEDURE `PROCEDURE_TEST`(
    _TEST_I int(11) ,
    _TEST_C VARCHAR(512)
)
BEGIN
DECLARE _TEST_I_EX int;
SELECT  nullif(TEST_I,1) INTO _TEST_I_EX FROM TEST WHERE TEST_I = _TEST_I ; /*用函数判断了,当这个值为null的时候*/
 IF _TEST_I <> _TEST_I_EX THEN
INSERT INTO TEST(
    TEST_I,
    TEST_C
    )
    VALUES(
    _TEST_I,
    _TEST_C
    );
    END IF ;
END;


第二次的修改,虽然问题点是正确的,但是改法不足。

因为查询结果为空,所以函数判断根本没用。




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 飞机托运了手机怎么办 飞机随身包超重怎么办 行李超过20公斤怎么办 飞机安检有钢板怎么办 飞机上拍照片怎么办? 飞机行李超重该怎么办 无法买机票出行怎么办 机票的保险发票怎么办 行李办理托运后怎么办 飞机托运超尺寸怎么办 机票无托运行李怎么办 飞机票不含托运怎么办 登机重量超了怎么办 随身行李超重了怎么办 国际航班没带护照怎么办 派出所不开户籍怎么办 做火车没身份证怎么办 2018年怎么办户籍证明 一岁宝宝护照怎么办 户籍证明开不了怎么办 信用卡提不了额怎么办 信用卡提额诈骗怎么办 信用卡提额失败怎么办 身份证证件号错误怎么办 东西落在飞机上怎么办 乘高铁忘记带身份证怎么办 身份证丢坐火车怎么办 苏州市民a卡怎么办 集体户口户口页怎么办 网上不能买火车票怎么办 集体户口离婚时怎么办 没户口本怎么办结婚证 酒店没带身份证怎么办 住酒店拍身份证怎么办 手机取火车票要怎么办 香港酒店没登记怎么办 住宿未带身份证怎么办 长期住酒店怎么办暂住证 港澳通行过期了怎么办 异地社保卡怎么办出来 住酒店换洗衣服怎么办