Как посчитать количество гласных - SQL Server - PullRequest
0 голосов
/ 26 июня 2018

Я хочу написать процедуру, например подсчет числа гласных в столбце. Так что, если мне это понадобится, мне не нужно писать процедуру снова. Я хочу использовать как find_vowel();

Пример:

Select Column_String 
From Tablo1 
Where Column_ID=1

Результат: "Я найду это"

Гласный: "Я, А, о, а, я, я"

В столбце 6 гласных (включая верхние - нижние символы).

Так, как я могу найти количество гласных в столбцах?

Я использую Microsoft SQL Server 2014

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Один из методов заключается в использовании функции NGrams8k для разделения строки и подсчета гласных.

Это создает очень простую функцию:

CREATE FUNCTION CountVowels (@InputString varchar(8000) )
RETURNS TABLE
AS RETURN

    SELECT COUNT(1) AS Vowels
    FROM dbo.NGrams8k(@InputString,1) N
    WHERE N.token IN ('A','a','E','e','I','i','O','o','U','u');

GO

Который затем можно вызвать с помощью:

SELECT YT.Columns, CV.Vowels
FROM YourTable YT
     CROSS APPLY CountVowels(YT.YourColumn) CV;

Обратите внимание, что обе эти функции принимают varchar(8000) (или вы можете создать эквивалент nvarchar(4000). Производительность будет значительно ниже, если вы измените параметры на varchar(MAX) или nvarchar(MAX).

0 голосов
/ 02 июля 2018

Довольно просто, если у вас есть таблица результатов; В приведенном ниже примере показано, как создать временный код для кода. Обратите внимание, что приведенный ниже пример основан на сопоставлении без учета регистра; как указано в ответе Ларну выше, это, возможно, необходимо решить.

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

/*Create tally table; this portion is not necessary if you have one*/
SELECT N= ROW_NUMBER() OVER (ORDER BY c.name)
INTO #Tally
        FROM sys.columns c



DECLARE @str varchar(8000) = 'I Am gonna find it'

SELECT COUNT(*)
FROM #Tally N
WHERE N <= LEN(@str) AND SUBSTRING(@str,N,1) IN ('A', 'E', 'I', 'O', 'U')

/*clean up temp tally table*/
DROP TABLE #Tally
0 голосов
/ 26 июня 2018

Замените все гласные на пустые (чтобы удалить их), затем вычтите длину строки без гласных из исходной длины:

select
    len(Column_String)
    - len(
        replace(replace(replace(replace(replace(
            lower(Column_String), 'a', ''), 'e', ''), 'i', ''), 'o', ''), 'u', '')
    ) as vowel_count
from ...

Как функция:

create function vowel_count(str nvarchar(1024))
returns int
as begin
    return (
      len(str) -
      len(replace(replace(replace(replace(replace(
            lower(str), 'a', ''), 'e', ''), 'i', ''), 'o', ''), 'u', ''));
end;   
...