回复 1# Aaron_liu 9.7版本之后可以直接用null(这里的null被认为是varchar类型)。9.7版本之前可以写cast (null as int)或者null||'',明确指定null的类型。在SQL解析过程中,对于每一个token,系统首先要判断其种类(关键词、数据库对象名、常量),如果是常量的话,接着要判断常量的数...
显示全部回复 1# Aaron_liu 9.7版本之后可以直接用null(这里的null被认为是varchar类型)。
9.7版本之前可以写cast (null as int)或者null||'',明确指定null的类型。
在SQL解析过程中,对于每一个token,系统首先要判断其种类(关键词、数据库对象名、常量),如果是常量的话,接着要判断常量的数据类型。在各种类型的常量里,null是很特殊的,其他类型都可以通过字面量直接确定其类型(1就是int,1.5就是decimal,'abc'就是varchar),唯独null不是。
早期版本的DB2是强类型的,使用null时必须明确指定类型,也不允许类型不同的变量之间进行比较。
举个例子:
SELECT
null+1
FROM
table (values 1) as tt
where
'123' = 123
这个语句在9.5版中执行会报错。
错误1:+只能用于两个数字类型变量之间,左边的null没有指定是数字类型。
错误2:'123'和123不是兼容的类型,不能直接比较。
必须要写成下面的样子才可以,是不是很麻烦?
SELECT
cast (null as int)+1
FROM
table (values 1) as tt
where
cast ('123' as int) = 123;
9.7版本之后在这方面有所改善,可以根据上下文决定null的数据类型(再不行的话就认为是varchar类型),也制定了一套不兼容数据类型之间进行运算时的类型转换策略。于是最上面的SQL语句可以直接执行。
收起