假设文档章节目录格式为
假设数据表中字段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,缺省值)