Standard SQL数据类型比较疑问:整数为何始终小于字符串?
数字和字符串跨类型比较的奇怪行为
SQL(Standard SQL/Google BigQuery)里的原因
核心问题出在隐式类型转换的规则上:
- 执行
LENGTH(title) < 4时,LENGTH()返回的是整数,和整数4直接做数值比较,逻辑完全正常,只会挑出标题长度小于4的行。 - 执行
LENGTH(title) < '4'时,数据库会自动做类型转换。在Standard SQL和BigQuery里,这种情况是把左边的整数转成字符串,再和右边的'4'按字典序比大小:- 字符串比大小是逐字符看ASCII码,比如长度10转成字符串'10',第一个字符'1'的ASCII码(49)比'4'的(52)小,所以'10' < '4'是
true; - 哪怕是长度5转成'5',只要你的数据里没有长度等于4的行,或者所有长度转成字符串后都满足字典序小于'4'(比如1-3、10以上的数),就会返回所有行。
- 字符串比大小是逐字符看ASCII码,比如长度10转成字符串'10',第一个字符'1'的ASCII码(49)比'4'的(52)小,所以'10' < '4'是
Python里的原因
你说的现象只在Python 2里存在:
- Python 2的跨类型比较规则很奇葩:按类型名称的字典序排,
int的类型名比str的小,所以任何整数和字符串比,整数 < 字符串都会返回true。 - 提醒下:Python 3已经改掉了这个不合理的规则,直接比数字和字符串会报错。
总结
这种问题都是跨类型比较时的隐式转换/规则差异搞出来的,写SQL和代码时尽量保证两边类型一致,别依赖这种模糊的自动转换,省得踩坑。
内容的提问来源于stack exchange,提问作者brking
相关产品推荐
相关产品推荐

