【发布时间】:2011-12-02 20:16:20
【问题描述】:
我想知道如何(如果可能的话)反转从 T-SQL 字符串 (varchar) 返回的 单词 的顺序。
我知道 T-SQL REVERSE 函数。但该函数也会反转单词中的字母,例如:
输入 > We want to tell you we all love StackOverflow
输出>wolfrevOkcatS evol lla ew uoy llet ot tnaw eW
我想在 T-SQL 中实际实现以下目标:
输入 > We want to tell you we all love StackOverflow
输出>Stackoverflow love all we you tell to want We
我在任何地方发现的唯一稍微相似的问题是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) 的顺序将它们全部拼凑成一个字符串。
【问题讨论】:
-
我认为您可以使用您引用的问题 - 但使用“”作为分隔符而不是逗号。一旦你有了拆分列表,就很容易操纵顺序。
-
为什么不使用您已经找到的解决方案?这是一个逗号分隔的字符串,但你的是空格分隔的,所以唯一的区别是分隔符(忽略标点符号问题)。更一般地说,这类问题是许多语言中常见的学习或教程练习,因此您可能会通过尝试自己解决(在 TSQL 或 CLR 过程中)然后在您有特定编码时发布来从这项任务中获得更多收益问题,你可以显示你已经尝试过的代码。
-
查看此问题以了解
SPLIT()函数问题的各种解决方案:stackoverflow.com/questions/2647/split-string-in-sql -
我没有使用我引用的问题的原因是因为我读到生产环境中的游标是一个坏主意?我确定必须有一个比那里发布的方式更简单的解决方案?
-
@Aracas:游标名声不好,因为大多数人使用它们来循环 SQL 结果集,做的事情可以通过基于集合的解决方案更好地解决。但我认为仅在少数内存变量上使用游标没有任何问题。
标签: sql-server sql-server-2005 tsql sqlclr