如何计算SQL Server列中的单词数

时间:2019-01-21 06:50:41

标签: sql sql-server

是否存在一个查询,该查询将返回一列中的单词总数?我找到了一些代码,可以让我计算字符串中的单词,但无法将其应用于整个列。

我首先创建从http://www.sql-server-helper.com/functions/count-words.aspx找到的函数:

CREATE FUNCTION [dbo].[WordCount] ( @InputString VARCHAR(4000) ) 
RETURNS INT
AS
BEGIN

DECLARE @Index          INT
DECLARE @Char           CHAR(1)
DECLARE @PrevChar       CHAR(1)
DECLARE @WordCount      INT

SET @Index = 1
SET @WordCount = 0

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

    IF @PrevChar = ' ' AND @Char != ' '
        SET @WordCount = @WordCount + 1

    SET @Index = @Index + 1
END

RETURN @WordCount

END
GO

接下来,在字符串上对其进行测试:

    DECLARE @String VARCHAR(4000)
    SET @String = 'Health Insurance is an insurance against expenses incurred through illness of the insured.'


SELECT [dbo].[WordCount] ( @String )

在此示例中,它返回13。但是,我试图获取整个列的总计。例如,如果我有一列包含两行,并且每一行都包含该字符串,那么我希望它返回26以反映该列中的总单词数,而不是单个字符串。

4 个答案:

答案 0 :(得分:5)

您可以总结此函数调用:

SELECT SUM([dbo].[WordCount]([my_column]))
FROM   [my_table]

答案 1 :(得分:4)

为什么要使用WHILE循环,因为您可以将单词数为

WITH TBL AS
(
  SELECT 'One' Str
  UNION
  SELECT 'One Two'
  UNION
  SELECT 'One Two Three'
  UNION
  SELECT 'One Two Three Four'
)
SELECT SUM((LEN(Str) - LEN(REPLACE(Str, ' ', ''))) + 1)
FROM TBL;
--WHERE Str <> '' AND Str IS NOT NULL;

这样,您将计算该列中的所有单词。

答案 2 :(得分:0)

引荐的教程中提供了另一种word count using SQL解决方案,其中使用WHILE循环REPLACE SQL函数代替WHILE循环来确定计数。

这些SQL解决方案存在的问题或缺少的部分是,它们不考虑诸如网址之类的模式。由于网址包含“ .com”,因此总字数加1。

所有标量函数都可以应用于表的特定列的值

SELECT dbo.scalarFunction(columnName) FROM tableName

答案 3 :(得分:0)

STRING_SPLIT是SQL 2016中引入的,我将其用于计数如下(TRIM是删除字符串之前或之后的任何空格)

i = 0;
i++ = 1;     // 1 or 2 ?

它将返回所有单词,现在,如果您需要消除重复的单词(例如,如果您发送要翻译的单词),则可以对值求和,也可以对DISTINCT求和。