-
- DB2(as400)数据分页SQL
- Weather:None
- 2009-07-06
方法1:
利用DB2自带(ORACLE一样)的”ROWNUMBER() OVER(ORDER BY sort-key)”函数来完成,用法如下
select * from (select rownumber() over(order by sortkey1 asc,sortkey2 desc,…) as rownumber_,* from dbname1 order by sortkey1 asc,sortkey2 desc) as temp_db where rownumber_ between ?start+1 and ?end
这种方法由于是DB2自带的,相对来说大量数据的时候效率可能会好点(待求证),但如果是查询的表比较多和条件比较多的时候感觉会有点混乱,容易出错.
方法2:
之前用过MSSQL的那种取出前一部分的最大ID然后再取比这个ID大的相对的page size数量的数量,这个方法比较通用一些,但问题是同样组装比较复杂,当然你可以弄到PROC里面,二是这个方法数据量很大的情况下,越往后的分页效率越低,并且效率变化很明显.
方法3:
使用”FETCH FIRST ?pagesize ROWS ONLY”,用法如下
select * from dbname1 where key not in(select key from dbname1 FETCH FIRST (page-1)*pagesize ROWS ONLY) FETCH FIRST pagesize ROWS ONLY
这种方法的效率现在还无从考证,但这种方法比较容易组装SQL,因为分页的部分虽然字符比较多,但全放在了条件语句后面.
综合三种方法,第二种需要一个排列的KEY,这样的条件,对于AS400里的DB2比较麻烦,因为我操作过的很多表,其实里面是没有用于排序的KEY甚至是没有KEY的,AS400采用自己的游标(类似一个内部的ID)来知道当前是第几条数据.第一第三种方法在KEY这方面相对好一些,但还不是太完美.
- Views(8598) | Comments(0) | In System/Application AS400について
-
- DB2的SQL将日期时间转化为数字串
- Weather:暴雨没下下来
- 2008-08-18
DB2中没有TO_CHAR函数,所以要将系统时间转化成字符串甚至是数字串的话,没有什么特别好的方法,但方法还是有的,虽然麻烦点。
INSERT INTO
LCDFLIB.FMOS01P(OSINPD,OSUSER,OSRKCD,OSSTRD,OSENDD,OSOSNI,OSCRDT,OSCRTM,OSCRTA)
VALUES(
(CAST (SUBSTR(CHAR(current timestamp),1,4) || SUBSTR(CHAR(current timestamp),6,2)||
SUBSTR(CHAR(current timestamp),9,2) || SUBSTR(CHAR(current timestamp),12,2) ||
SUBSTR(CHAR(current timestamp),15,2) || SUBSTR(CHAR(current timestamp),18,2) AS BIGINT)),'TANAKA ','K22 ',20080815,20080914,'LJASLDFJWOIEJFLSDKJFL',20080818,153251,'TANAKA ')思路为,用current timestamp取系统的日期时间,然后用char()转化为字符串,再用SUBSTR()取出其中的数字部分,联接,最后再用CAST()函数将日期的数字串转换成大数值型。
由于日期的数字串长达14位,所以integer即int32长度不够,只能转换成BIGINT或是Decimal这种高精度的才行。
比如在.NET当中,要用Decimal.TryParse()而不能用Integer.TryParse()
- Views(9677) | Comments(2) | In web develop
