如果我没有理解好,你需要一种方法来提取一个给定的字符串最长的话(一个或多个),而不使用任何表来存储数据。
如果是这样,这可能是一个办法:
with test(s) as (select ' a cd efg hijk lmnop qrst uvw xy z LMNOP' from dual)
select word
from (
select regexp_substr(s, '[^ ]+', 1, level) as word,
rank() over (partition by 1 order by length(regexp_substr(s, '[^ ]+', 1, level)) desc) as rank
from test
connect by regexp_instr(s, '[^ ]+', 1, level) > 0
)
where rank = 1
WORD
----------
lmnop
LMNOP
内查询使用常用的方法来分割字符串,然后使用rank
基于其词的长度来评估每一行:
with test(s) as (select ' a cd efg hijk lmnop qrst uvw xy z LMNOP' from dual)
select regexp_substr(s, '[^ ]+', 1, level) as word,
rank() over (partition by 1 order by length(regexp_substr(s, '[^ ]+', 1, level)) desc) as rank
from test
connect by regexp_instr(s, '[^ ]+', 1, level) > 0
WORD RANK
---------- ----------
lmnop 1
LMNOP 1
hijk 3
qrst 3
efg 5
uvw 5
xy 7
cd 7
z 9
a 9
外部部分只是简单地过滤结果,只得到顶级单词的行,即最长的单词。
如果您有超过一个字的顶部长度,并且基于假设输入字符串采用您发布的格式,例如,如果您添加逗号来分隔单词,则会将其视为单词的一部分。
我只能想到使用子字符串正则表达式很难。 – FreedomPride
将字符串拆分为单词可能是您唯一的选择,如果您计划在没有PL/SQL的情况下执行此操作。 –
这还不清楚。如果多于一个单词被绑定时间最长,是否要将它们全部归还?如果你的字符串包含所有长度相同的单词,比如7个字符 - 如果不是在单独的行中,你打算如何“返回”它们?所以你不必把弦分开吗?你的意思是“没有那种奢侈”?哪个豪华? – mathguy