CASE WHEN 逻辑转换
创建更复杂的输出字段
例如:
如何根据买入数量,区分大单、中单、小单
交易数量 | 类型 |
---|---|
[3000, +∞) | 大单 |
(300,3000) | 中单 |
(0,300] | 小单 |
SELECT volume,
CASE WHEN volume >= 3000 THEN '大单'
WHEN volume > 300 AND volume < 3000 THEN '中单'
WHEN volume <= 300 THEN '小单'
END//CASE 一定要用END来结尾
FROM t_stock_trans_dtl
WHERE opt_typ = '买入';
# 也可以这样写:
SELECT volume,
CASE WHEN volume >= 3000 THEN '大单'
WHEN volume > 300 AND volume < 3000 THEN '中单'
ELSE '小单'
END//CASE 一定要用END来结尾
FROM t_stock_trans_dtl
WHERE opt_typ = '买入';
CASE WHEN 语法一:
CASE WHEN 条件表达式1 THEN 结果表达式1
WHEN 条件表达式2 THEN 结果表达式2
……
WHEN 条件表达式N THEN 结果表达式N
[ELSE ELSE条件表达式]
END
#没有ELSE部分时,如果所有条件表达式都不满足,则返回NULL。
#每一个CASE WHEN都应该有ELSE分支!!!
又例如:
对于买入的交易,交易数量为正数,而卖出的交易,交易数量为负数。这就导致交易金额(交易价格*交易数量)的返回值有正有负。如何根据交易类型做转换,交易金额全部返回正数?
交易类型 | 返回交易金额 |
---|---|
买入 | 交易价格*交易数量 |
卖出 | 0-交易价格*交易数量 |
# 语法一
SELECT opt_typ,opt_tm,volume,
CASE WHEN opt_typ = '买入' THEN price*volume
WHEN opt_typ = '卖出' THEN 0 - price*volume
ELSE '其他'
END as '交易总额'
FROM t_stock_trans_dtl;
# 语法二
SELECT opt_typ,opt_tm,volume,
CASE opt_typ
WHEN '买入' THEN price*volume
WHEN '卖出' THEN 0 - price*volume
ELSE '其他'
END as '交易总额'
FROM t_stock_trans_dtl;
CASE WHEN 语法二:
CASE 条件表达式
WHEN 匹配表达式1 THEN 结果表达式1
WHEN 匹配表达式2 THEN 结果表达式2
……
WHEN 匹配表达式N THEN 结果表达式N
[ELSE ELSE表达式]
END
#适用于条件表达式的结果,是一个可穷举的列表,结果是一个确定的值
#但不适用于条件表达式的结果是一个范围的情况
【注意:】
-
CASE WHEN:满足当前条件后,只执行当前的THEN便结束了
-
两种CASE WHEN的语法均可嵌套操作,但不推荐
-
建议最多嵌套两层并使用括号格式化SQL语句
# 用查询结果创建临时表:
CREATE TEMPORARY TABLE 临时表名 AS
(
SELECT * FROM 旧的表名
);