2017-02-16 60 views
0

我想在Oracle查询中查找varchar2中的最长单词(字符串)。在某些情况下,我会将字符串拆分为表中的单独字,然后聚合函数可以解决它(例如,一旦我有最大长度(my_field),我可以追踪最长的字)。这种情况下,我没有这种奢侈品,所以我需要计算一个字符串中最长的单词没有聚合使用Oracle SQL查找字符串中最长的单词

我发现了一种方法来使用REGEXP_REPLACE找到长度超过N个字符的单词,但这并不坏。没有看到使用正则表达式或任何其他函数找到最长的单词的方式。

下面是我用来查找超过4个字符的单词的简化版本:

select 
    regexp_replace(
    ' a cd efg hijk lmnop qrst uvw xy z ' 
    , '([^[:alnum:]][[:alnum:]]{1,3}[^[:alnum:]])' 
    , ' ' 
    , 1 
    , 0 
) x 
from dual; 

但是我怎么能只返回最长的单词?

+0

我只能想到使用子字符串正则表达式很难。 – FreedomPride

+1

将字符串拆分为单词可能是您唯一的选择,如果您计划在没有PL/SQL的情况下执行此操作。 –

+1

这还不清楚。如果多于一个单词被绑定时间最长,是否要将它们全部归还?如果你的字符串包含所有长度相同的单词,比如7个字符 - 如果不是在单独的行中,你打算如何“返回”它们?所以你不必把弦分开吗?你的意思是“没有那种奢侈”?哪个豪华? – mathguy

回答

0

编辑:对不起,我没有完全读你的意图。因此,出于某种原因,您无法使用聚合函数,以下解决方案仅供参考。最好的问候!

WITH tmp AS 
(
    SELECT 
     regexp_substr(' a cd efg hijk lmnop qrst uvw xy z ','[^ ]+', 1, level) col 
    FROM 
     dual 
    CONNECT BY 
     regexp_substr(' a cd efg hijk lmnop qrst uvw xy z ', '[^ ]+', 1, level) IS NOT NULL 
) 
SELECT 
    col 
FROM 
    tmp 
WHERE 
    length(col) = (SELECT MAX(length(col)) FROM tmp); 
0

如果我没有理解好,你需要一种方法来提取一个给定的字符串最长的话(一个或多个),而不使用任何表来存储数据。

如果是这样,这可能是一个办法:

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 

外部部分只是简单地过滤结果,只得到顶级单词的行,即最长的单词。

如果您有超过一个字的顶部长度,并且基于假设输入字符串采用您发布的格式,例如,如果您添加逗号来分隔单词,则会将其视为单词的一部分。

相关问题