Как я могу посчитать количество слов в строке в Oracle?


Я пытаюсь подсчитать, сколько слов есть в строке в SQL.

Select  ("Hello To Oracle") from dual;

Я хочу показать количество слов. В данном примере это будет 3 слова, хотя между словами может быть больше одного пробела.

4 8

4 ответа:

Вы можете использовать что-то подобное этому. Это возвращает длину строки, а затем вычитает длину строки с удаленными пробелами. К тому времени добавление числа один к этому должно дать вам количество слов:

Select length(yourCol) - length(replace(yourcol, ' ', '')) + 1 NumbofWords
from yourtable

Смотрите SQL Fiddle with Demo

Если вы используете следующие данные:

CREATE TABLE yourtable
    (yourCol varchar2(15))
;

INSERT ALL 
    INTO yourtable (yourCol)
         VALUES ('Hello To Oracle')
    INTO yourtable (yourCol)
         VALUES ('oneword')
    INTO yourtable (yourCol)
         VALUES ('two words')
SELECT * FROM dual
;

И запрос:

Select yourcol,
  length(yourCol) - length(replace(yourcol, ' ', '')) + 1 NumbofWords
from yourtable

Результат таков:

|         YOURCOL | NUMBOFWORDS |
---------------------------------
| Hello To Oracle |           3 |
|         oneword |           1 |
|       two words |           2 |

Поскольку вы используете Oracle 11g, это еще проще -

select regexp_count(your_column, '[^ ]+') from your_table

Вот демонстрационная версия sqlfiddle

Если требуется удалить несколько пробелов, попробуйте сделать следующее:

Select length('500  text Oracle Parkway Redwood Shores CA') - length(REGEXP_REPLACE('500  text Oracle Parkway Redwood Shores CA',
'( ){1,}', ''))  NumbofWords
from dual;

Поскольку я использовал таблицу dual, Вы можете проверить это непосредственно в своей собственной среде разработки.

DECLARE @List       NVARCHAR(MAX) = '   ab a 
x'; /*Your column/Param*/
DECLARE @Delimiter  NVARCHAR(255) = ' ';/*space*/
DECLARE @WordsTable TABLE (Data VARCHAR(1000));

/*convert by XML the string to table*/
INSERT INTO @WordsTable(Data)
SELECT Data = y.i.value('(./text())[1]', 'VARCHAR(1000)')
FROM 
( 
SELECT x = CONVERT(XML, '<i>' 
    + REPLACE(@List, @Delimiter, '</i><i>') 
    + '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)



/*Your total words*/
select count(*) NumberOfWords
from @WordsTable
where Data is not null;

/*words list*/
select *
from @WordsTable
where Data is not null

/из этой логики можно продолжить alon /