私はよく理解している場合は、データを格納するための任意のテーブルを使用せずに、指定された文字列から最長の単語(一つ以上)を抽出する方法が必要です。
もしそうであれば、この方法であり得る:
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つ以上あり、入力文字列が投稿した形式であるという前提に基づいています。たとえば、単語を区切るためにカンマを追加した場合、その単語の一部とみなされます。
私は部分文字列を正規表現として使うのは難しいとしか思えません。 – FreedomPride
PL/SQLを使用せずに文字列を単語に分割することは、唯一の選択肢です。 –
これは不明です。複数の単語が一番長い単語の場合は、すべて返されますか?あなたの文字列が同じ長さのすべての単語を持っている場合、7文字としましょう。別々の行ではないにしても、どのようにそれらを「返す」ように提案しますか?とにかく文字列を分割する必要はありませんか?そして、「贅沢はありません」とはどういう意味ですか?どの贅沢? – mathguy