oracle 匹配一个字符串长度,Oracle:获取部分字符串匹配的长度

不知道“干净”,但这里有两个解决方案.

-- The hardcoded, bad performance. No transformation of your string though.

with patterns as (

select substr('ABCDEFGHIJ', 1, rownum) txt

from dual

connect by level <= length('ABCDEFGHIJ')

)

select d.txt, coalesce(max(length(p.txt)), 0)

from dummy d

left join patterns p

on instr(d.txt, p.txt) = 1

group by d.txt

order by 2 desc;

-- The cool one with regex.

-- Though transforming your input string,

-- this can also be done with ease making something that transorms it for you

-- like in the previous example, more complicated task than the previous,

-- as oracle sucks with string manipulation. You can however write it in java.

select d.txt, coalesce(LENGTH(REGEXP_SUBSTR(d.txt, '^A(B(C(D(E(F(G(H(I(J)?)?)?)?)?)?)?)?)')), 0)

from dummy d;

UPDATE

with patterns as (

select substr('ABCDEFGHIJ', 1, rownum) txt

from dual

connect by level <= length('ABCDEFGHIJ')

)

select d.txt, coalesce(max(length(p.txt)), 0)

from dummy d

left join patterns p

on instr(d.txt, p.txt) = 1

where d.txt LIKE substr('ABCDEFGHIJ', 1, 1) || '%'

group by d.txt

order by 2 desc;

在oracle 10g上测试生成的查询计划

SELECT STATEMENT, GOAL = ALL_ROWS

SORT ORDER BY

SORT GROUP BY NOSORT

NESTED LOOPS OUTER

INDEX RANGE SCAN I <<<< Uses the index.

VIEW

COUNT

CONNECT BY WITHOUT FILTERING

FAST DUAL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值