2017-02-16 11 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 

外部の部分は単に結果をフィルタリングして最上位の単語、つまり最も長い単語の行を取得するだけです。

これは、最長の単語が2つ以上あり、入力文字列が投稿した形式であるという前提に基づいています。たとえば、単語を区切るためにカンマを追加した場合、その単語の一部とみなされます。

関連する問題