db2数据库常用函数

db2数据库常用函数,第1张

1、value函数

用法: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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6760047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存