SQL判断章节是否是某文档的最后2章?

假设文档章节目录格式为

 假设数据表中字段item储存目录标题(例如:3.4)

随便获取一个章节标题可以通过一下SQL来确定是否是最后2章的目录标题

SELECT FIRST 
FROM(
	SELECT
		MAX(TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) ) AS FIRST,
		MAX(TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) - 1 ) AS second 
	FROM
		dcc_par a 
	WHERE
		a.FILE_Id = #{id}
		AND a.DEL_FLAG = '0'  
		AND TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) IS NOT NULL 
	) 
WHERE
FIRST IS NOT NULL 
	AND (TO_NUMBER( FIRST ) >= TO_NUMBER(substr(#{item},0,DECODE(instr( #{item}, '.' ),0,LENGTH(#{item}),instr( #{item}, '.' ) - 1 ) ) ) ) 
	AND TO_NUMBER( second ) <= TO_NUMBER(substr(#{item},0,DECODE(instr( #{item}, '.'),0,LENGTH(#{item}),instr( #{item}, '.' ) - 1 ) ) ) 
//item为验证的目录标题

如果文档最后2章为9和10,那么只有item为以9和10开头的字符串可以通过这个SQL得到值10,除了最后2章的其他的开头(例如:1,2开头的)得不到值。

其中:

SELECT
	MAX(TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) ) AS FIRST,
	MAX(TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) - 1 ) AS second 
FROM
	dcc_par a 
WHERE
	a.FILE_Id = #{id}
	AND a.DEL_FLAG = '0'  
	AND TO_NUMBER(substr(a.ITEM,0,DECODE(instr( a.ITEM, '.' ),0,LENGTH( a.ITEM ),instr( a.ITEM, '.' ) - 1 ) ) ) IS NOT NULL 

这个SQL查询的是该文档最后2章的标题,假设最后2章是以9,10开头,查询结果为

记一下:

instr函数:

格式: instr(sourceString,aimString,startpos,apperPosition)

         instr(源字符串,目标字符串,开始位置,第几次出现)

其中:开始位置默认为1,第几次出现指的是从源字符串中查找第几次出现目标字符串,默认为1。如果开始位置值为负数,则表示从右往左找,位置数据依旧从左向右计算。

返回值为字符串出现的位置,如果没找到,返回0值。

SELECT  instr('10.1','.',1,1) AS NUM  FROM  DU      ----->   值为3

SELECT  instr('10.1.4','.',-2,1) AS NUM  FROM  DU      ----->   值为5

substr函数:

格式:substr(sourceString,pos,len) 从pos位置开始,截取len个字符

substr(源字符串,开始位置,截取个数)

其中:截取个数可以不写,默认从开始位置截取到最后。pos可以去负数,表示从右向左找,但截取数依旧从左向右计算。

例如:substr(string,-2,2) 含义:取string倒数第二位数开始,2字长字符串。

结果为:ng

length()函数:计算字符串长度

DECODE()函数

        含义:decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值