sql-server - 反转 T-SQL 中的单词顺序

标签 sql-server sql-server-2005 tsql sqlclr

我想知道如何(如果可能的话)反转从 T-SQL 字符串 (varchar) 返回的单词 的顺序。

我知道 T-SQL REVERSE 函数。但该函数还会反转单词中的字母,例如:

Input > 我们想告诉你我们都喜欢 StackOverflow
输出 > wolfrevOkcatS evol lla ew uoy llet ot tnaw eW

我想在 T-SQL 中实际实现以下目标:

Input > 我们想告诉你我们都喜欢 StackOverflow
输出 > Stackoverflow 喜欢你告诉我们想要的一切

我在任何地方发现的唯一稍微相似的问题是 this one ,但是这包括拆分逗号分隔的字符串,我不需要这样做。

我确信有一种方法可以实现上述目标,即使它是自定义函数或 SQL-CLR 函数也是如此。


我设法使用以下方法拆分了我的字符串:

-- Create a space delimited string for testing
declare @str varchar(max)
select @str = 'We want to tell you we all love StackOverflow'
-- XML tag the string by replacing spaces with </x><x> tags
declare @xml xml
select @xml = cast('<x><![CDATA['+ replace(@str,' ',']]></x><x><![CDATA[') + ']]></x>' as xml)
-- Finally select values from nodes <x> and trim at the same time
select ltrim(rtrim(mynode.value('.[1]', 'nvarchar(50)'))) as Code
from (select @xml doc) xx
cross apply doc.nodes('/x') (mynode)

现在的问题是试图以向后 (DESC) 顺序将所有内容重新组合成一个字符串。

最佳答案

您可以在 SQL 中创建一个小函数来反转如下所示的字符串:

DECLARE @source VARCHAR(MAX)
DECLARE @dest VARCHAR(MAX)
DECLARE @lenght INT

SET @source = 'We want to tell you we all love StackOverflow'
SET @dest = ''

WHILE LEN(@source) > 0
BEGIN
    IF CHARINDEX(' ', @source) > 0
    BEGIN
        SET @dest = SUBSTRING(@source,0,CHARINDEX(' ', @source)) + ' ' + @dest
        SET @source = LTRIM(RTRIM(SUBSTRING(@source,CHARINDEX(' ', @source)+1,LEN(@source))))
    END
    ELSE
    BEGIN
        SET @dest = @source + ' ' + @dest
        SET @source = ''
    END
END
SELECT @dest

关于sql-server - 反转 T-SQL 中的单词顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684818/

相关文章:

c# - 更新数据库 n :n

sql-server - 不使用子查询的不同行计数

sql - 仅当传递的参数具有值时才使用 Where 子句中的 'Exists'

sql-server - SSRS报告文件(.rdl)如何升级到最新?

asp.net - SQL 查询和特殊字符

SQL Server ROUND 不工作

sql - Group By 基于另一列的聚合

java - 比较 Visual Basic sql 和 Java sql

sql-server - 如何在 T-SQL 表变量中重新植入标识列?

sql-server - 捕获删除临时表中行的用户