使用SQL查找字符串中最长的单词
我在网上找到了以下代码片段:使用SQL查找字符串中最长的单词,sql,sql-server,Sql,Sql Server,我在网上找到了以下代码片段: DECLARE @str VARCHAR(5000)= 'aaaa bbbbb cccccccc ddddddddddddddddddd' SELECT TOP 1 Split.a.value('.', 'VARCHAR(100)') as longest_Word FROM (SELECT Cast ('<M>' + Replace(@str, ' ', '</M><M>') + '</M>' AS XML)
DECLARE @str VARCHAR(5000)= 'aaaa bbbbb cccccccc ddddddddddddddddddd'
SELECT TOP 1 Split.a.value('.', 'VARCHAR(100)') as longest_Word
FROM (SELECT Cast ('<M>' + Replace(@str, ' ', '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
ORDER BY Len(Split.a.value('.', 'VARCHAR(100)')) DESC
一个简单的交叉应用在这里会有所帮助
注意,我使用了自己的XML解析器,因为它是XML安全的
Declare @YourTable table ([COLUMN 1] varchar(max))
Insert Into @YourTable values
('ABC ABCD'),
('BC BCDE'),
('9II IIIIV')
Select A.[COLUMN 1]
,Result = B.RetVal
From @YourTable A
Cross Apply (
Select Top 1 *
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(A.[COLUMN 1],' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B1
Order by Len(RetVal) Desc,RetSeq
) B
编辑-要显示领带吗
返回
COLUMN 1 Result
ABC ABCD ABCD
BC BCDE BCDE
9II IIIIV IIIIV
COLUMN 1 Result
ABC ABCD ABCD
BC BCDE 1234 BCDE --<< Tie
BC BCDE 1234 1234 --<< Tie Added for Illustration
9II IIIIV IIIIV
一个简单的交叉应用在这里会有所帮助
注意,我使用了自己的XML解析器,因为它是XML安全的
Declare @YourTable table ([COLUMN 1] varchar(max))
Insert Into @YourTable values
('ABC ABCD'),
('BC BCDE'),
('9II IIIIV')
Select A.[COLUMN 1]
,Result = B.RetVal
From @YourTable A
Cross Apply (
Select Top 1 *
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(A.[COLUMN 1],' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B1
Order by Len(RetVal) Desc,RetSeq
) B
编辑-要显示领带吗
返回
COLUMN 1 Result
ABC ABCD ABCD
BC BCDE BCDE
9II IIIIV IIIIV
COLUMN 1 Result
ABC ABCD ABCD
BC BCDE 1234 BCDE --<< Tie
BC BCDE 1234 1234 --<< Tie Added for Illustration
9II IIIIV IIIIV
你怎么处理领带?@SqlZim很有道理。我会留意OP的反应。@johncapelletti我只是好奇而已。已经对您的答案进行了升级,因为无论回复如何,这都是一个小调整。您如何处理领带?@SqlZim很好。我会留意OP的反应。@johncapelletti我只是好奇而已。已经对你的答案投了更高的票,因为这将是一个小的调整,不管回答如何。这看起来不错。一个次要的评论是,如果字段包含标点符号,如逗号、句号和括号,则此代码将有效地将其视为其相邻单词的一部分. 为了避免这种情况,在应用上述逻辑之前,可以用空格替换每个有问题的标点符号。尽管对于某些字符来说,这可能会很尴尬,比如撇号,它可以存在于单词内部和周围。@SteveLovell是真的,但OP没有提到任何标点符号。如果是这样,还有其他技术来规范化字符串。目前,我将把它视为是以空格分隔的感谢John的帮助,不过这仍然是基于您自己输入的示例。实际上,我想将此应用于具有现有列的现有表。但是用我的表名替换@yourtable不起作用,列名也一样。@Probs不,它是基于您输入的一个示例。atYourTable只是一个表变量,它是演示性的。你完全错了,两个例子都有效。由于您提供了详细信息,我们相信您能够做出必要的调整。只有一个[YourTable]要替换,两个[COLUMN 1]要替换。这看起来不错。一个次要的评论是,如果字段包含标点符号,如逗号、句号和括号,则此代码将有效地将其视为其相邻单词的一部分. 为了避免这种情况,在应用上述逻辑之前,可以用空格替换每个有问题的标点符号。尽管对于某些字符来说,这可能会很尴尬,比如撇号,它可以存在于单词内部和周围。@SteveLovell是真的,但OP没有提到任何标点符号。如果是这样,还有其他技术来规范化字符串。目前,我将把它视为是以空格分隔的感谢John的帮助,不过这仍然是基于您自己输入的示例。实际上,我想将此应用于具有现有列的现有表。但是用我的表名替换@yourtable不起作用,列名也一样。@Probs不,它是基于您输入的一个示例。atYourTable只是一个表变量,它是演示性的。你完全错了,两个例子都有效。由于您提供了详细信息,我们相信您能够做出必要的调整。只有一个[YourTable]要替换,两个[COLUMN 1]要替换。