MaxCompute中type的类型是varchar(4),写法1的结果是B,写法2是A,为什吗?

写法1:case when type ='10' then A else B end price 写法2:case when type =10 then A else B end price MaxCompute中type的类型是varchar(4),写法1的结果是B,写法2的结果是A,为什么会这样? 写法1的 http://logview.odps.aliyun.com/logview/?h=http://service.odps.aliyun.com/api&p=bill_center&i=20230515083110339g0wht7e51gk4&token=NXJSQlBCODhOOFRFUW1QL0tLNXozdEZ0MndZPSxPRFBTX09CTzpwNF8yNzY0MzMyNjAwMjcxODA1MTQsMTY4NjczMTQ3MCx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6cHJvamVjdHMvYmlsbF9jZW50ZXIvaW5zdGFuY2VzLzIwMjMwNTE1MDgzMTEwMzM5ZzB3aHQ3ZTUxZ2s0Il19XSwiVmVyc2lvbiI6IjEifQ==写法2的 http://logview.odps.aliyun.com/logview/?h=http://service.odps.aliyun.com/api&p=bill_center&i=202305150832015gm895fpium1&token=em9XRnpVV3RzOThoMzZYVXRRYmwveVdpUHRFPSxPRFBTX09CTzpwNF8yNzY0MzMyNjAwMjcxODA1MTQsMTY4NjczMTUyMSx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6cHJvamVjdHMvYmlsbF9jZW50ZXIvaW5zdGFuY2VzLzIwMjMwNTE1MDgzMjAxNWdtODk1ZnBpdW0xIl19XSwiVmVyc2lvbiI6IjEifQ== desc bill_center.ods_zipper_cust_hourse_10;的结果lQLPJxJPYjqQsF4fzQM3sC9nC2bf98qTBFlBmjFA0wA_823_31.png

展开
收起
冰激凌甜筒 2023-05-22 13:14:51 101 分享 版权
阿里云 AI 助理回答

在MaxCompute中,CASE WHEN表达式的条件判断结果依赖于数据类型和比较规则。以下是针对问题的详细分析和解答:


1. 问题背景

  • 写法1CASE WHEN type = '10' THEN A ELSE B END price
  • 写法2CASE WHEN type = 10 THEN A ELSE B END price
  • 已知条件
    • type字段的数据类型为VARCHAR(4)
    • 写法1的结果是B,写法2的结果是A

2. 原因分析

写法1:CASE WHEN type = '10' THEN A ELSE B END price

  • 在写法1中,type = '10'的比较中,'10'是一个字符串(VARCHAR类型)。
  • MaxCompute在进行比较时,会严格匹配数据类型。由于type字段本身是VARCHAR(4),因此type'10'的比较是字符串比较
  • 字符串比较时,type的值必须完全等于'10'(包括长度和内容),才会返回TRUE
  • 如果type的实际值是'10 '(末尾有空格)或其他不符合严格匹配的情况,则条件type = '10'FALSE,最终返回ELSE分支的值B

写法2:CASE WHEN type = 10 THEN A ELSE B END price

  • 在写法2中,type = 10的比较中,10是一个整数(INT类型)。
  • MaxCompute在处理不同类型的数据比较时,会尝试将VARCHAR类型的type字段隐式转换为INT类型。
  • 隐式转换规则如下:
    • 如果type的值可以被解析为一个有效的整数(例如'10'),则转换成功,比较结果为TRUE
    • 如果type的值无法被解析为整数(例如'10 '或非数字字符),则转换失败,可能会导致异常或默认行为。
  • 在本例中,假设type的值为'10',它能够成功转换为整数10,因此条件type = 10TRUE,最终返回THEN分支的值A

3. 关键点总结

  • 数据类型的影响
    • 写法1中,type'10'是字符串比较,要求严格匹配。
    • 写法2中,type10是数值比较,涉及隐式类型转换。
  • 隐式类型转换的风险
    • VARCHAR字段与数值类型进行比较时,MaxCompute会尝试将VARCHAR转换为数值类型。如果转换失败,可能会导致意外结果或错误。
  • 推荐做法
    • 显式类型转换:为了避免隐式转换带来的不确定性,建议在比较前使用CAST函数显式转换数据类型。例如:
    CASE WHEN CAST(type AS INT) = 10 THEN A ELSE B END price
    

    或者:

    CASE WHEN type = CAST(10 AS VARCHAR(4)) THEN A ELSE B END price
    

4. 结论

  • 写法1的结果是B,因为type'10'是字符串比较,未满足严格匹配条件。
  • 写法2的结果是A,因为type10是数值比较,type被隐式转换为整数后满足条件。
  • 建议:在实际开发中,尽量避免依赖隐式类型转换,使用显式类型转换以确保逻辑清晰且结果可预期。

参考资料

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

还有其他疑问?
咨询AI助理