全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
流计算

CASEWHEN

更新时间:2018-03-14 22:48:49

语法

  1. CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

入参

功能描述

如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e 。

需要注意的地方

case when 返回常量字符串的时候,会在字符串后面补全空格。例如下面的例子当满足else条件的时候返回值是 ‘ios ‘, 后面会多几个空格。

  1. case when device_type = 'android'
  2. then 'android'
  3. else 'ios'
  4. end as os

解决办法:

  • 1 利用trim函数,去除空格。对这个例子来说,在用到os字段的地方,用 trim(os)
  • 2.利用 cast 将常量字符串转为 varchar类型
    1. case when device_type = 'android'
    2. then (cast 'android' as varchar)
    3. else (cast 'ios' as varchar)
    4. end as os

示例

  • 测试数据
device_type(VARCHAR)
android
ios
win

测试案例1 (有问题的)

  1. create table T1(
  2. device_type varchar
  3. )with(
  4. type='tt',
  5. topic='topic1',
  6. accessId='xxxx',
  7. accessKey='xxxxxxx'
  8. );
  9. create table tt_output(
  10. os varchar,
  11. length int
  12. ) with (
  13. type='print'
  14. );
  15. INSERT INTO tt_output
  16. SELECT
  17. os,
  18. CHAR_LENGTH(os)
  19. from(
  20. SELECT
  21. case when device_type = 'android'
  22. then 'android'
  23. else 'ios'
  24. end as os
  25. FROM T1
  26. );
  • 如下为测试结果,可以看到输出的ios值后面有空格导致长度计算出来为7,而不是3
os(VARCHAR) length(INT)
android 7
ios 7
ios 7

测试案例2 (正确的做法)

  1. create table T1(
  2. device_type varchar
  3. )with(
  4. type='tt',
  5. topic='topic1',
  6. accessId='xxxx',
  7. accessKey='xxxxxxx'
  8. );
  9. create table tt_output(
  10. os varchar,
  11. length int
  12. ) with (
  13. type='print'
  14. );
  15. INSERT INTO tt_output
  16. SELECT
  17. trim(os), -- 这里加了trim
  18. CHAR_LENGTH(trim(os)) -- 这里加了trim
  19. from(
  20. SELECT
  21. case when device_type = 'android'
  22. then 'android'
  23. else 'ios'
  24. end as os
  25. FROM T1
  26. );
  • 如下为测试结果,可以看到对ios字段做了trim后消除了空格,结果符合预期
os(VARCHAR) length(INT)
android 7
ios 3
ios 3

测试案例3 (正确的做法)

  1. create table T1(
  2. device_type varchar
  3. )with(
  4. type='tt',
  5. topic='topic1',
  6. accessId='xxxx',
  7. accessKey='xxxxxxx'
  8. );
  9. create table tt_output(
  10. os varchar,
  11. length int
  12. ) with (
  13. type='print'
  14. );
  15. INSERT INTO tt_output
  16. SELECT
  17. os,
  18. CHAR_LENGTH(os)
  19. from(
  20. SELECT
  21. case when device_type = 'android'
  22. then cast('android' as varchar) -- 这里加了cast
  23. else cast('ios' as varchar) -- 这里加了cast
  24. end as os
  25. FROM T1
  26. );
  • 如下为测试结果,可以看到加了对常量字符串cast转为varchar后,结果符合预期
os(VARCHAR) length(INT)
android 7
ios 3
ios 3
本文导读目录