Чтобы иметь возможность выполнять регулярные выражения на SQL сервере без использования CLR, я изучаю использование языка R. У меня есть набор текстов, и я хочу посчитать количество совпадений регулярного выражения в каждой строке.
Примечание : часть "R" находится в пределах @script
переменная в блоке кода, показанном ниже. Это та часть, где эта проблема.
Для примера: у меня есть таблица InputData
:
CREATE TABLE InputData (ID INT IDENTITY(1, 1), Text NVARCHAR(MAX))
Эта таблица содержит 3 строки:
INSERT INTO InputData(Text)
VALUES ('This is the first row'),
('This is the second row'),
('This is the third row')
Я бы хотел выполнить запрос, который возвращает количество раз, когда буква i
находится в каждой строке, с помощью регулярного выражения (поскольку нужный мне поиск немного сложнее). После некоторого поиска в Google я пришел к следующему:
EXEC SP_EXECUTE_EXTERNAL_SCRIPT
@Language=N'R',
@script = N'pattern = ".*i.*"
outData <- inData;
outData$MatchCount <- length(gregexpr(pattern, outData$Text));'
, @input_data_1 = N'select ID, Text, 0 MatchCount from InputData'
, @input_data_1_name = N'inData'
, @output_data_1_name=N'outData'
with result sets ((ID INT, Text NVARCHAR(MAX), MatchCount INT));
Теперь вышеприведенное не работает, потому что regexpr
запускает выражение во всем наборе и всегда возвращает «3», так как набор содержит 3 ряда. Я хотел бы, чтобы он возвращал количество совпадений в строке и помещал результат в правильную строку.
Таким образом, результат должен быть:
1, 'This is the first row', 3
2, 'This is the second row' 2
3, 'This is the third row', 3
В идеале, мне даже не нужно было бы возвращать текст в результирующем наборе. Достаточно только идентификатора и количества совпадений