我想在列中编写类似元音计数的过程。因此,如果我随时需要它,则无需再次编写该过程。我想像find_vowel()
;
示例:
Select Column_String
From Tablo1
Where Column_ID=1
结果:“我会找到它的”
Vowel:“ I,A,o,a,i,i”
该列中有6个元音(包括上下两个字符)。
那么如何在列中找到元音的数量?
我正在使用Microsoft SQL Server 2014
谢谢
答案 0 :(得分:3)
将所有元音替换为空白(以删除它们),然后从原始长度中减去无元音字符串的长度:
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;
答案 1 :(得分:2)
一种方法是使用函数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)
。
答案 2 :(得分:0)
如果有理货表,这非常容易;下面的示例向您展示了如何为了代码而创建一个临时的代码。请注意,下面的示例基于不区分大小写的排序规则;如上述Larnu的回应所指出,这可能需要解决。
您可以根据需要将代码包装在函数或proc中,但是我建议您找到一种在应用程序级别进行这种字符串处理的方法。 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