用法:select value(id,'') from merchant
如果id为空,返回空,如果id不为空,返回id的值;
2、nvl函数
用法:select nvl(id,'') from merchant
如果id为空,返回空,如果id不为空,返回id的值;
3、substr函数
用法:select substr(src_ip,1,2) from tbl_sybvclear_txn;
从src_ip第一位开始,取两位;
4、length函数
用法:select length(src_ip) from tbl_sybvclear_txn;
计算字符串的长度,不必赘述;
5、ltrim函数,rtrim函数
用法:去掉左侧,右侧的空格;
6、letf函数,right函数
用法:select left(src_ip,3),right(src_ip,3) from tbl_sybvclear_txn;
取src_ip左边3个,右边3个字符串;
7、concat函数
用法:select concat(src_ip,chl_resp) from tbl_sybvclear_txn;
字符串连接,mysql支持三个以上参数,db2只支持两个参数;
8、replace函数
用法:select src_ip,replace(src_ip,'223','55') from tbl_sybvclear_txn;
把src_ip中223全部替换成55;
9、to_char函数,to_date函数,to_timestamp函数
用法:将数值型转成字符型
10、avg函数
用法:select avg(mcht_fee) from tbl_sybvclear_txn;
返回mcht_fee平均值;
11、count函数
用法:太常用,不赘述;
12、sum函数
用法:太常用,不赘述;
13、max函数,min函数
用法:取某列的最大值,最小值;
多行转一行CREATE TABLE TestTitle (
name VARCHAR(10),
title VARCHAR(20)
)
INSERT INTO TestTitle VALUES ('张三', '程序员')
INSERT INTO TestTitle VALUES ('张三', '系统管理员')
INSERT INTO TestTitle VALUES ('张三', '网络管理员')
INSERT INTO TestTitle VALUES ('李四', '项目经理')
INSERT INTO TestTitle VALUES ('李四', '系统分析员')
Oracle 的时候
使用 WMSYS.WM_CONCAT 处理SQL> SELECT
2 name,
3 WMSYS.WM_CONCAT(title) AS allTitle
4 FROM
5 TestTitle
6 GROUP BY
7 name
NAME
ALLTITLE
李四
项目经理,系统分析员
张三
程序员,系统管理员,网络管理员
DB2
使用 CTE 处理WITH
t1 (id, name, title) AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS ID,
name,
title
FROM
TestTitle
),
t2 (id, name, title) AS
(
SELECT
t1.id,
t1.name,
CAST(t1.title AS varchar(100)) AS title
FROM
t1
WHERE
t1.id = 1
UNION ALL
SELECT
t1.id,
t2.name,
CAST( t1.title || ',' || t2.title AS varchar(100)) AS title
FROM
t1, t2
WHERE
t1.name = t2.name
AND t1.id = (t2.id + 1)
)
SELECT
name,
title
FROM
t2
WHERE
NOT EXISTS (
SELECT 1
FROM t2 t22
WHERE
t2.name = t22.name
AND t2.id < t22.id
)
NAME TITLE
---------- ---------------------------------------------------------------------
-------------------------------
SQL0347W 递归公共表表达式 "WZQ.T2" 可能包含无限循环。 SQLSTATE=01605
李四 项目经理,系统分析员
张三 网络管理员,系统管理员,程序员
已选择 2 条记录,打印 1 条警告消息。
不知道你DB2 版本:
DB2 9.7 文档中显示, 有一个 LISTAGG 函数可以完成这类的处理.
http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0058709.html
摘自博客:之前弄过oracle的行转列了,现在研究下db2的行转列.
db2函数没有oracle那么强大,像oracle,几行代码能解决的问题换成db2的话,需要更多的代码了
下面粘出来,大家看下。要是发现问题给我留言哈
1.多行转一行
WITH rs as ( select name,row_number() over() RN from T_test),
RPL (RN, name) AS
(
select ROOT.RN,CAST(ROOT.name AS VARCHAR(2000)) from rs ROOT
UNION ALL
SELECT CHILD.RN, CHILD.name||','||PARENT.nameFROM RPL PARENT, rs CHILD WHERE PARENT.RN +1 = CHILD.RN
)
select MAX(name) namefrom RPL GROUP BY RN ORDER BY RN DESC
fetch first 1 rows only
2。行转列和oracle相同
===================================
with rs as(
select 'a' A, 2 B, 'www' C
from dual
union all
select 'b' A, 1 B, 'www' C
from dual
union all
select 'c' A, 3 B, 'sss' C
from dual
union all
select 'd' A, 4 B, 'ddd' C from dual)
/*
select rs.C,
case rs.A when 'a' then rs.B else 0 end ver_high,
case rs.A when 'b' then rs.B else 0 end v_high,
case rs.A when 'c' then rs.B else 0 end v_low,
case rs.A when 'd' then rs.B else 0 end ver_low
from rs
*/
select rs.C,
sum(case rs.A when 'a' then rs.B else 0 end) ver_high,
sum(case rs.A when 'b' then rs.B else 0 end) v_high,
sum(case rs.A when 'c' then rs.B else 0 end) v_low,
sum(case rs.A when 'd' then rs.B else 0 end) ver_low
from rs
group by C from rs
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)