在SQL Server中,每个单词在字符串中重复了多少次?

3

我声明了一个字符串,如下所示:

Declare @string
Set @string = 'this line is like this because this is repeated these many times in this line'

我正在尝试找出每个单词重复的次数。我期望得到以下结果:

Word   Number
this    x times
line    y times
is      z times

帮我处理一下代码。非常感谢您的帮助。

编辑:

目前为止,我已经找到了将特定字母替换为数字的单词。

以下是代码:

SELECT Len(@string) - Len(Replace(@string, 'x', '')).

任何对提供的代码的解释都将不胜感激。谢谢。

1
你目前尝试了什么?StackOverflow不是一个代码编写服务。如果你在某些特定的代码上遇到了问题,大多数人都会很乐意帮助你。http://stackoverflow.com/help/how-to-ask - Tom H
1
说实话,我对 SQL 还很新。到目前为止,我已经理解了如何查找一个特定字母被替换的数字单词。我会在编辑中发布代码。 - MycrowSoft
1
@MycrowSoft 不用担心,让我尝试为您的问题编写一个查询。 - Chiragkumar Thakar
2
@TomH 謝謝你提供的鏈接,我一定會仔細閱讀並嘗試在下次發問時自我修正。 - MycrowSoft
1
@ChiragThakar 谢谢您的时间。 - MycrowSoft
3个回答

5
;WITH splitString(val) AS       
(
    -- convert the string to xml, seperating the elements by spaces
    SELECT    CAST('<r><i>' + REPLACE(@string,' ','</i><i>') + '</i></r>' AS XML)
)
SELECT  [Key],
        COUNT(*) [WordCount]
FROM    (   -- select all of the values from the xml created in the cte
            SELECT  p.value('.','varchar(100)') AS [Key]
            FROM    splitString
                    CROSS APPLY val.nodes('//i') t (p)) AS t
GROUP BY [Key]

如果您想要涉及所有技术细节...

;WITH splitString(val) AS       
(
    -- convert the string to xml, seperating the elements by spaces
    SELECT    CAST('<r><i>' + REPLACE(@string,' ','</i><i>') + '</i></r>' AS XML)
)
SELECT  Word,
        CAST(COUNT(*) AS VARCHAR) 
            + (CASE WHEN COUNT(*) = 1 THEN ' time' ELSE ' times' END) AS  Number
FROM    (   -- select all of the values from the xml created in the cte
            SELECT  p.value('.','varchar(100)') AS Word
            FROM    splitString
                    CROSS APPLY val.nodes('//i') t (p)) AS t
GROUP BY Word

工作得非常完美,感谢您的时间。 - MycrowSoft

2
使用 t-sql 分割器非常简单。我个人偏爱 Jeff Moden 的分割器,可以在这里找到。http://www.sqlservercentral.com/articles/Tally+Table/72993/ 还有其他一些选项可以在这里找到。http://sqlperformance.com/2012/07/t-sql-queries/split-strings 使用 Jeff Moden 的方法非常简单。
Declare @string varchar(1000)
Set @string = 'this line is like this because this is repeated these many times in this line'

select x.Item
    , COUNT(*) as WordCount
from dbo.DelimitedSplit8K(@string, ' ') x
group by x.Item
order by x.Item

1
这里是可能解决您问题的代码。
首先运行以下函数。
CREATE FUNCTION dbo.fnSplit(

 @sInputList VARCHAR(8000) -- List of delimited items

, @sDelimiter VARCHAR(8000) = ' ' -- delimiter that separates items

 ) RETURNS @List TABLE (item VARCHAR(8000))

 BEGIN

 DECLARE @sItem VARCHAR(8000)

 WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0

 BEGIN

 SELECT

 @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,

    @sInputList,0)-1))),

 @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,

    @sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0

 INSERT INTO @List SELECT @sItem

 END

 IF LEN(@sInputList)> 0

 INSERT INTO @List SELECT @sInputList -- Put the last item in

 RETURN

 END

现在运行这段代码。
Declare @string Varchar(MAX)
Set @string = 'this line is like this because this is repeated these many times in this line'

DECLARE @Words AS TABLE(
ID INT IDENTITY(1,1),
Words VARCHAR(50))

INSERT INTO @Words
select * from fnSplit(@string, ' ')

SELECT Words AS Word, COUNT(*) Number FROM @Words GROUP BY Words ORDER BY Number DESC

@MycrowSoft 好的,这是我的荣幸,我总是尽力帮助。 - Chiragkumar Thakar
那样可以工作,但是那种分割器在性能方面绝对是最差的。 - Sean Lange
@SeanLange 当然,我会尝试改进这个。感谢您的建议。 - Chiragkumar Thakar
以下是一些更好的分隔符选项。http://sqlperformance.com/2012/07/t-sql-queries/split-strings当您在分隔符中看到光标或while循环时,它不会良好地扩展。这就是集合操作的本质。 :) - Sean Lange
你也可以查看我回答中关于Tally表的链接。 - Sean Lange
@SeanLange 是的,我做了。 - Chiragkumar Thakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接