我们平常写SQL中遇到过滤空值或者NULL值的处理,尤其是在非关系型数据库中没有唯一键和默认值的约束要求,很容易出现NULL值或者空值。很多时候我们总是会出现困扰,到底是该使用=' ' 还是用 is NULL呢?
另外我们一个多表JOIN的查询在这个SQL上跑的好好的,一旦换了一个SQL执行引擎就提示我们JOIN两边的数据类型不一致,这些都是为什么呢?
今天就带大家一起领略一下各类SQL中空值以及类型转换那些坑。
空值和NULL值
一、底层字段类型为字符型(string,varchar,char):
hive:如果底层存储的是NULL值,我们必须要用 is NULL来判断,如果底层存储的是' ',则需要使用 =' '来判断。在hive中NULL默认存储为'\N',' '存储还是' '。
presto:与hive保持一致。
spark:与hive保持一致。
impala:与hive保持一致。
mysql:使用上与hive使用保持一致。
二、底层字段是(int,bigint)
hive:由于int类型的数据在hive中默认存储为'\N',所以查询的时候必须要使用is NULL才能取出空的值。
presto:与hive中保持一致,不能使用='',会报类型错误。
spark:与hive中保持一致。
impala:与presto保持一致,只能使用is NULL,使用=''由于后面是字符类型,会报错。
mysql:与presto保持一致&#