Oracle中使用decode
优雅的行转列
最近笔者在工作中终于还是碰到了行转列的应用场景,做一下笔记供自己查看和帮助有需求的人。
在其他关系数据库中,大多推荐用case when then end
这种臃肿复杂的写法,最近看到oracle数据库中独有的函数decode
十分优雅,下面简单介绍一下。
decode
函数
定义:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
在代码中可以理解为:
if 条件==值1:
返回值1
elif 条件==值2:
返回值2
elif 条件==值n:
返回值n
else:
缺省值
在关系数据库中可以理解为:
case 条件
when 值1 then 返回值1
when 值2 then 返回值2
when 值n then 返回值n
else 缺省值
end as 列
如果要判断表达式的大小而不是等于某个值,可以用:sign()函数。
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual;
示例:
TYPE | NAME | CLASS | NUM_FLAG |
---|---|---|---|
水果 | 香蕉 | 出售 | 50 |
水果 | 香蕉 | 剩余 | 23 |
水果 | 香蕉 | 单价 | 7 |
宠物 | 小猫 | 出售 | 3 |
宠物 | 小猫 | 剩余 | 5 |
SQL语句:
SELECT TYPE,NAME
, SUM(DECODE(CLASS,'出售',NUM_FLAG,0)) AS 出售
, SUM(DECODE(CLASS,'剩余',NUM_FLAG,0)) AS 剩余
, SUM(DECODE(CLASS,'单价',NUM_FLAG,0)) AS 单价
FROM TEMP_TABLE
GROUP BY TYPE,NAME
执行后效果
TYPE | NAME | 出售 | 剩余 | 单价 |
---|---|---|---|---|
水果 | 香蕉 | 50 | 23 | 7 |
宠物 | 小猫 | 3 | 5 | 0 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。