SQL Server在字符串中连接/连接不同的单词以获取所有子字符串

SQL Server在字符串中连接/连接不同的单词以获取所有子字符串,sql,sql-server,Sql,Sql Server,我想在SQL server中将单词连接到一个句子中。我需要它在每次循环使用下一个单词作为开始词。例如,字符串/句子可以是“This is a句子” 我需要可能的结果是: This Thisis Thisisa Thisisasentence is isa isasentence a asentence sentence 我知道如何集中注意力,但我不太确定如何用每次不同的第一个单词来做每一个单词 提前谢谢 编辑: 根据要求提供更多信息 我有一个表帐户(IS(PK)、姓名、国家) 我有另一个表ac

我想在SQL server中将单词连接到一个句子中。我需要它在每次循环使用下一个单词作为开始词。例如,字符串/句子可以是“This is a句子”

我需要可能的结果是:

This
Thisis
Thisisa
Thisisasentence
is
isa
isasentence
a
asentence
sentence
我知道如何集中注意力,但我不太确定如何用每次不同的第一个单词来做每一个单词

提前谢谢

编辑: 根据要求提供更多信息

我有一个表
帐户(IS(PK)、姓名、国家)

我有另一个表
accountsubstring(SubID(pk),AccountID,Substring)

我需要将“Name”列分解为上面的示例“This is a句子”,这样每个子字符串在AccountSubstring中都有自己的行条目。子ID对于每一行都是唯一的,AccountID将映射到子字符串来自哪个“名称”。这是为了匹配目的而进行的


谢谢

您可以使用递归CTE来实现这一点。基本上,您需要相邻的组合。我更喜欢在单词之间留空格,这样它们才是可见的。以下内容还假设单词是唯一的:

declare @s varchar(max) = 'This is a sentence';

with words as (
      select s.value as word, row_number() over (order by charindex(s.value, @s)) as seqnum
      from string_split(@s, ' ') s
     ),
     cte as (
      select seqnum, word as combined, format(seqnum, '000') as seqnums
      from words
      union all
      select w.seqnum, concat(cte.combined, ' ', w.word), concat(seqnums, ':', format(w.seqnum, '000'))
      from cte join
           words w
           on w.seqnum = cte.seqnum + 1
     )
select *
from cte
order by seqnums;
他是一把小提琴


这里真正棘手的部分是保持单词的顺序。这就是
row\u number()
所做的事情,它捕获了订单——以及唯一性限制的来源。当然,这可以用递归CTE代替,这很好(并且允许重复的单词)。

您可以用递归CTE来实现这一点。基本上,您需要相邻的组合。我更喜欢在单词之间留空格,这样它们才是可见的。以下内容还假设单词是唯一的:

declare @s varchar(max) = 'This is a sentence';

with words as (
      select s.value as word, row_number() over (order by charindex(s.value, @s)) as seqnum
      from string_split(@s, ' ') s
     ),
     cte as (
      select seqnum, word as combined, format(seqnum, '000') as seqnums
      from words
      union all
      select w.seqnum, concat(cte.combined, ' ', w.word), concat(seqnums, ':', format(w.seqnum, '000'))
      from cte join
           words w
           on w.seqnum = cte.seqnum + 1
     )
select *
from cte
order by seqnums;
他是一把小提琴


这里真正棘手的部分是保持单词的顺序。这就是
row\u number()
所做的事情,它捕获了订单——以及唯一性限制的来源。当然,这可以用递归CTE代替,这很好(并且允许重复单词)。

查看您所做的更新,您可以按照

SELECT *
FROM (VALUES('This is a sentence')) T(Name)
JOIN (VALUES('This'), ('is'), ('a'), ('sentence')) TT(SubString)
ON CONCAT(' ', T.Name, ' ') LIKE CONCAT(' %', TT.SubString, ' %');

这里的表
T
是您的表
Account
,表
TT
是您的表
accountSubstrings
查看您所做的更新,您可以按

SELECT *
FROM (VALUES('This is a sentence')) T(Name)
JOIN (VALUES('This'), ('is'), ('a'), ('sentence')) TT(SubString)
ON CONCAT(' ', T.Name, ' ') LIKE CONCAT(' %', TT.SubString, ' %');


这里的表
T
是您的表
Account
,表
TT
是您的表
accountSubstrings

,前提是您可以为示例数据和表结构提供将要使用的逻辑helpful@Avi我编辑并添加了更多信息,谢谢,如果你能提供你的样本数据和表结构,逻辑将是helpful@Avi我已编辑并添加了更多信息,thankshow我是否会将其更改为函数,因为我想这样做以遍历我的Account表中的所有行,并将子字符串作为新行插入accountsubstring表中?此外,它将只返回“合并”部分,因为这将插入accountSubstring表?所以它会把@Name当作@s,非常感谢much@user19902020 . . . 这将是一个不同的问题。这回答了您在这里提出的问题。我已经创建了一个新问题,非常感谢您的帮助。希望能更好地解释一下,我如何将其更改为函数,因为我希望这样做可以遍历Account表中的所有行,并将子字符串作为新行插入accountsubstring表中?此外,它将只返回“合并”部分,因为这将插入accountSubstring表?所以它会把@Name当作@s,非常感谢much@user19902020 . . . 这将是一个不同的问题。这回答了您在这里提出的问题。我已经创建了一个新问题,非常感谢您的帮助。希望它能被更好地解释,谢谢,但我需要它返回单词concat,并通过更改第一个单词来初始化,直到所有concat都完成。我需要它能够接受一个列,因为它需要在Account表的'Name'列中执行所有行。Gordon的上述答案有效,但我正在尝试将其改为函数,但不断给我错误您已经在
Substring
column@user19902020中有了单词,它只显示了单词,它们不存在,我已经运行了它,它也只适用于上述单词,但它需要包含在一个列中。“这是一个句子”这句话只是作为一个如何拆分/合并的例子。以下是您的查询给我的信息:这是一个句子这是一个句子这是一个句子这是一个句子请@user1990202阅读并遵循我的问题/解释是否有问题?非常感谢,但我需要它通过更改第一个单词,直到所有连接完成。我需要它能够接受一个列,因为它需要在Account表的'Name'列中执行所有行。Gordon的上述答案有效,但我正在尝试将其改为函数,但不断给我错误您已经在
Substring
column@user19902020中有了单词,它只显示了单词,它们不存在,我已经运行了它,它也只适用于上述单词,但它需要包含在一个列中。“这是一个句子”这句话只是作为一个如何拆分/合并的例子。以下是您的查询给我的信息:这是一个句子这是一个句子这是一个句子这是一个句子请@user1990202阅读并遵循我的问题/解释有问题吗?