Snowflake中MIN函数处理数值字符串的机制及异常结果解惑
问题描述
执行如下SQL语句:
select min(val) from (select '10026096' as val union select '1002793' as val);
得到的输出为:
MIN(VAL) 10026096
但从数值上看10026096大于1002793,需要了解Snowflake的MIN函数返回该结果的原因,以及它处理数值字符串的具体逻辑。
原因及逻辑说明
- 核心原因:你的
val列是字符串类型,Snowflake的MIN函数对字符串类型字段是按**字典序(lexicographical order)**比较,而非数值大小。 - 字符串字典序的比较规则:从左到右逐个字符比对,每个字符按ASCII值大小判断,一旦某一位字符分出大小,直接决定整个字符串的大小,不再比较后续字符。
在你的例子里:- 两个字符串前四位都是
'1'、'0'、'0'、'2',完全一致; - 第五位字符分别是
'6'(ASCII值54)和'7'(ASCII值55),'6'的ASCII值更小,所以'10026096'在字典序中比'1002793'小,因此MIN函数返回它。
- 两个字符串前四位都是
- 补充说明:如果两个字符串前面的字符都相同,短字符串会被认定为更小(比如
'123'比'1234'小),但你的例子在第五位就已经分出大小,所以没触发这个规则。
按数值取最小值的解决方法
如果需要按照数值大小获取最小值,需先将字符串转换为数值类型,比如使用TO_NUMBER函数:
select min(to_number(val)) from (select '10026096' as val union select '1002793' as val);
执行后会返回正确的数值最小值1002793。
内容的提问来源于stack exchange,提问作者sa_
相关产品推荐
相关产品推荐

