1. 不同数据类型比较
先来看一段SQL。表dean_test
中字段a
的类型是整型INT,字段b
的类型是字符串/字符型STRING/VARCHAR。
select * from dean_test where a = b
这就是不同数据类型比较。
现实中发现不少数据类型不匹配的比较能兼容地进行隐性类型转换。但是,隐性类型转换的一个大前提应该是不能丢失精度!换句话说,显性转换和隐性转换的结果必须是一致的!
2. hive的坑
date和string
hive早期的版本是没有date类型的,所以date都是用string来表示。因此早期的date_add返回的数据类型是string。
我们举个例子:下面这个条件在以前以字符串进行比较的时候是不会有问题的。结果应该是true
。
'2019-07-11 08:00:00' > date_add('2019-07-12', -1)
它等价于
'2019-07-11 08:00:00' > '2019-07-11'
但是现在date_add
函数返回的数据类型是date
。于是date > string
在进行隐性转换的时候,按之前官方说法是date会转成string,那么上面的条件是能成立的,应该是true
。
然而如今hive代码中的情况是,string
被转成了date
。因此'2019-07-11 08:00:00'
在被转换成date
的时候,丢失了时间精度。于是上面的条件就等价于
'2019-07-11' > '2019-07-11'
所以这个不等式在新版的hive中是不成立的,结果是false
。
而我们在date_add('2019-07-12', -1)
外面再包一层强制类型转换
'2019-07-11 08:00:00' > cast(date_add('2019-07-12', -1) as string)
这个结果就是true
了。
未完待续…