Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL查找字符串中最长的单词_Sql_Sql Server - Fatal编程技术网

使用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]要替换。