PL / SQL количество слов из строки - PullRequest
0 голосов
/ 05 февраля 2019

Подскажите, пожалуйста, как считать слова в строке?Формат такой:

n_var VARCHAR2(1000) := 'Hello, I like ham pizza more than mozzarella pizza.'

Мне нужно вывести что-то вроде этого: hello => 1, I => 1, например => 1, ham => 1, pizza => 2 ...

Моя идея - использовать ассоциативный массив, но я не уверен, как это сделать.Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Другим вариантом будет следующий запрос:

select word, count(1) as repeating
  from
  (
    with t(str) as
    (
     select 'Hello, I like ham pizza more than mozzarella pizza' from dual   
    )    
    select regexp_replace(regexp_substr(str,  '[^\ ]+', 1, level),'[^a-zA-Z]','')
        as word
      from t
     cross join dual
    connect by level <= regexp_count(str,  '[^\ ]+') 
   )   
 group by word
 order by repeating desc, word;

WORD       REPEATING
---------- ---------
pizza          2
ham            1
Hello          1
I              1
like           1
more           1
mozzarella     1
than           1
0 голосов
/ 05 февраля 2019

Вот одно из решений.Он использует регулярные выражения для разделения слов из вашей строки на токены.Затем эти токены подсчитываются с помощью простой функции агрегирования.Таким образом, чистый SQL и отсутствие необходимости в ассоциативных массивах или любой другой коллекции PL / SQL.

with dat as (
    select 'Hello, I like ham pizza more than mozzarella pizza.' as str from dual
)  , tkns as (
    select regexp_substr(str, '([[:alnum:]]+)', 1, level) as tkn
    from dat
    connect by level <= regexp_count(str, '[\., ]')
)
select tkn, count(*)
from tkns
where tkn is not null
group by tkn
order by tkn
/ 

Несомненно, существуют более элегантные решения регулярных выражений, но по крайней мере это работает.

...