2003年7月13日更新: 由于本文档最初是由一些数据库引擎编写的 测试已更新,用户已发送 对下表的更正。 原始数据显示出多种多样 但随着时间的推移,行为的范围已经趋同 PostgreSQL/Oracle模型。 唯一的显著差异 Informix和MS-SQL都将NULL视为 在独特的列中模糊。
NULL对于UNIQUE列是不同的,但对于 SELECT DISTINCT和UNION仍然令人困惑。 看起来NULL 应该在任何地方或任何地方都是不同的。 以及SQL标准 文件表明,NULL应该在任何地方都是不同的。 然而,截至 在本文中,没有经过测试的SQL引擎将SELECT中的NULL视为不同的 DISTINCT语句或在UNION中。
--我已经决定SQL对NULL的处理是反复无常的,不能 --由逻辑推导。 它必须通过实验来发现。 为此,我已经 --准备了以下脚本来测试各种SQL数据库如何处理NULL。 --我的目标是使用从这个脚本中收集的信息使SQLite成为 --尽可能类似于其他数据库。 -- --如果可以的话,请在数据库引擎中运行此脚本并将结果邮寄 --发送给我 drh@hwaci.com ,这将是一个很大的帮助。 请确保识别 --用于此测试的数据库引擎。 谢谢。 -- --如果必须更改任何内容才能使此脚本与数据库一起运行 --引擎,请将修改后的脚本与结果一起发送。 -- --使用数据创建测试表 创建表t1(a int,b int,c int); 插入t1值(1,0,0); 插入t1值(2,0,1); 插入t1值(3,1,0); 插入t1值(4,1,1); 插入t1值(5,null,0); 插入t1值(6,null,1); 插入t1值(7,null,null); --检查CASE对其测试表达式中的NULL做了什么 选择a,当b<>0时,选择1,否则0从t1结束; 选择a+10,如果不是b<>0,则选择1,否则从t1结束0; 选择a+20,当b<>0和c<>0时,1从t1结束; 选择a+30,如果不是(b<>0和c<>0),则选择1,否则0从t1结束; 选择a+40,如果b<>0或c<>0,则1从t1结束; 选择a+50,如果不是(b<>0或c<>0),则选择1,否则0从t1结束; 选择a+60,当c时为b,然后从t1开始为1,否则为0; 选择a+70,当b时为c,然后从t1开始为1,否则为0; --当NULL乘以0时会发生什么? 从t1中选择a+80,b*0; 从t1中选择a+90,b*c; --其他运算符的NULL会发生什么情况? 从t1开始选择a+100,b+c; --测试骨料操作员的待遇 从t1中选择计数(*)、计数(b)、总和(b)和平均值(b),最小(b)或最大(b); --检查WHERE子句中NULL的行为 从t1中选择a+110,其中b<10; 从t1中选择a+120,其中b不大于10; 从t1中选择a+130,其中b<10或c=1; 从t1中选择a+140,其中b<10 AND c=1; 从t1中选择a+150,其中不选择(b<10 AND c=1); 从t1开始选择一个+160,其中不是(c=1 AND b<10); --检查DISTINCT查询中NULL的行为 从t1中选择不同的b; --检查UNION查询中NULL的行为 从t1联合中选择b从t1中选择b; --创建具有唯一列的新表。 检查是否考虑NULL --与众不同。 创建表t2(a int,b int unique); 插入t2值(1,1); 插入t2值(2,null); 插入t2值(3,空); 从t2中选择*; 升降台t1; 升降台t2;