Impala 是一种开源的SQL查询引擎,它支持使用SQL语言来查询存储在 Hadoop 的 HDFS 和 HBase 中的 PB 级大数据。本文列举笔者在日常开发工作中,常用的 Impala 选择与判断相关函数。
1.CASE WHEN
case when 有两种形式可以表达:
1.1 第一种表达方式
CASE a WHEN b THEN c[WHEN d THEN e ] ...[ELSE f ]
END
/*[] 代表可选*/
1.2 第二种表达方式
CASEWHEN a THEN b[WHEN c THEN d ]...[ELSE e ]
END
/*[] 代表可选*/
2. IF
IF(boolean表达式,条件为真时的返回值,条件为假时的返回值);
eg:
SELECT IF(10 > 20, 'true', 'false');
上述语句表示,如果10 大于 20,则返回 ‘true’,否则返回 ‘false’。
3. DECODE
DECODE 函数相较于IF函数更加灵活,可以用于比较一个字段的值和多个可能的值。笔者常用 DECODE 函数来实现条件判断或自定义排序功能。
3.1 条件判断
假设我们有一个名为prod_info的表,其中包含prod_id和prod_name两个字段,我们想根据prod_id的值来决定如何格式化prod_name的显示。
用 DECODE 函数表达为:
SELECT
prod_id,
DECODE(prod_id, 1, 'Product A', 2, 'Product B', 'Product C') AS prod_name
FROM prod_info
;
可能对于第一次接触 DECODE 函数的伙伴有些看不懂,这里同步 CASE WHEN 函数的写法,看看是否更能表达清晰些:
SELECT
prod_id AS prod_id,
CASE prod_idWHEN 1 THEN 'Product A'WHEN 2 THEN 'Product B'ELSE 'Product C'
END AS prod_name
FROM prod_info
;
3.2 自定义排序
在日常开发中有不少需要自定义排序的需求场景,如业务字段中值包含有‘存款’,‘贷款’,‘中收’,该表需要按‘存款’,‘贷款’,‘中收’顺序依次展示对应其他字段信息。一个实现思路就是在查询语句中排序函数( ORDER BY )后使用 DECODE 函数。
...
ORDER BY DECODE(business_name, '存款', 1, '贷款', 2, '中收', 3)
;
ASC:升序,默认值。
DESC:降序。
如此,想要展示优先顺序如何只需将对应内容按数字大小编排即可。
4. NVL
NVL函数常用于处理数据中的空值,可以用于条件判断、默认值设定等场景。
lmpala中的 NVL 函数是用来处理空值的函数,它接受两个参数,如果第一个参数为非空值,则返回该参数的值;如果第一个参数为 NULL,则返回第二个参数的值。
NVL(exp1, exp2)
exp1: 要进行判断的表达式,如果为 NULL 则返回 exp2 的值.
假设我们有一个表 emp_info,其中包含一列 salary 表示员工的薪水,有些员工的薪水值为空,现在要实现如果员工薪水值为空,则用 0 替代。
SELECT
emp_id,
emp_name,
NVL(salary, 0) AS salary
FROM emp_info
;
5. COALESCE
COALESCE函数与NVL函数类似,也是常用于处理数据中的空值,可以用于条件判断、默认值设定等场景,不过 COALESCE 函数更灵活,该函数用来匹配多个字段的值。如果表达式1的值为 NULL,那么显示表达式2的值,如果表达式2的值也为空,那么显示表达式3的值,以此类推。
COALESCE(列名,表达式1,表达式2,...,表达式n)
SELECT
t1.emp_id,
COALESCE( t1.emp_name, t2.emp_name, '' ) AS emp_name
FROM emp_info t1
LEFT JOIN post_info t2
ON ( t2.emp_id = t1.emp_id )
;
上述语句中 COALESCE函数 所在行表示先取 t1(emp_info) 表中的 emp_name 字段值,若该值为 NULL 则取 t2 (post_info)表中的 emp_name 字段值,否则给默认值 空字符串(‘’).
– END ------------------------