2016-01-21 2 views
0

У меня есть эта таблица в моей базе данных, заполненная большими строками, и я пытаюсь проанализировать текст, который содержится в этих строках.SQL Server 2012 String splitting

У меня есть что-то вроде этого.

On August the third the pope talked on vatican square.... bla bla 

То, что я хочу знать, это что-то вроде этого

Word | Count 
ON  | 2 
August | 1 
the | 2 
third | 1 

и так один, я знаю, что я должен был бы разбить эти строки и найти пробелы «»,»,„“. "и так далее, чтобы функция знала, что это слово перед этим, а после - строка < length.

Результаты должны перейти к новой таблице, как показано выше.

Как именно я мог бы достичь этого с помощью функции SQL?

+1

Во-первых, SQL Server имеет собственные службы полнотекстового поиска * и * данных. Вы не должны пытаться анализировать текст самостоятельно. Во-вторых, существуют десятки повторяющихся вопросов и несколько вариантов разделения строки [как показано здесь] (http://sqlperformance.com/2012/07/t-sql-queries/split-strings) –

ответ

1

Вы могли бы разделить и сосчитать:

DECLARE @t NVARCHAR(400)='On August the third the pope talked on vatican square.' 

;WITH tally AS 
(
    SELECT TOP 1000 rn = ROW_NUMBER() OVER(ORDER BY 1/0) 
    FROM master..spt_values 
), cte AS(  
SELECT REPLACE(REPLACE(SUBSTRING(' ' + @t + ' ', rn + 1, 
CHARINDEX(' ', ',' + @t + ' ', rn + 1) - rn -1),'.', ''), ',','') AS word 
FROM tally 
WHERE rn <= LEN(' ' + @t + ' ') - 1 
    AND SUBSTRING(' ' + @t + ' ', rn, 1) = ' ' 
) 
SELECT word, COUNT(*) AS total 
FROM cte 
GROUP BY word; 

LiveDemo

Выход:

╔═════════╦═══════╗ 
║ word ║ total ║ 
╠═════════╬═══════╣ 
║ August ║  1 ║ 
║ On  ║  2 ║ 
║ pope ║  1 ║ 
║ square ║  1 ║ 
║ talked ║  1 ║ 
║ the  ║  2 ║ 
║ third ║  1 ║ 
║ vatican ║  1 ║ 
╚═════════╩═══════╝ 
+0

Есть десятки повторяющихся вопросов , Это просто [один из вариантов] (http://sqlperformance.com/2012/07/t-sql-queries/split-strings), а не самый быстрый. Самый быстрый по порядку - использовать вспомогательную функцию SQLCLR –

1
DECLARE @text NVARCHAR(MAX) = 'On August the third the pope talked on vatican square.... bla bla' 

SELECT t.display_term, COUNT(*) 
FROM sys.dm_fts_parser('"' + @text + '"', 1049, NULL, 1) t 
WHERE t.special_term = 'Exact Match' 
GROUP BY t.display_term 

Выход -

--------------- ----------- 
august   1 
bla    2 
on    2 
pope   1 
square   1 
talked   1 
the    2 
third   1 
vatican   1 
+0

+1 для * другой * техники, чем те, которые были отправлены в мириадах повторяющихся вопросов. Как насчет производительности? –

+0

Хороший вопрос;) Я действительно тестировал 'dm_fts_parser' на' 2Gb' таблице ('~ 1Mb' за строку). Быстрее, чем 'CTE' и' XML', но медленнее, чем 'CLR'. В дополнение, пользователь должен иметь права 'sysadmin' ... – Devart