【问题标题】:SQL Server concat/join different words in a string to get all substringsSQL Server连接/连接字符串中的不同单词以获取所有子字符串
【发布时间】:2020-04-04 19:23:17
【问题描述】:

我想在 SQL Server 的句子中加入单词。我需要它循环使用下一个单词作为每次连接的起始单词。例如,字符串/句子可以是“这是一个句子”。

我需要可能的结果是:

This
Thisis
Thisisa
Thisisasentence
is
isa
isasentence
a
asentence
sentence

我知道如何连接,但我不太确定如何每次都用不同的第一个单词来处理每个单词。

提前致谢!

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

我有一张桌子Account(IS(PK), Name, Country)

我还有一张桌子accountSubstrings(SubID(pk), AccountID, Substring)

我需要将“名称”列分解为上面的示例“这是一个句子”,以便每个子字符串在 accountSubstrings 中都有自己的行条目。 subID 对每一行都是唯一的,AccountID 将映射到子字符串来自的任何“名称”。这样做是为了匹配。

谢谢

【问题讨论】:

  • 如果您可以为您的示例数据和表结构提供有用的逻辑
  • @Avi 我已经编辑并添加了更多信息,谢谢

标签: sql sql-server


【解决方案1】:

您可以使用递归 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;

Here 是一个 dbfiddle。

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

【讨论】:

  • 如何将其更改为一个函数,因为我想这样做以遍历帐户表中的所有行并将子字符串作为新行插入到帐户子字符串表中?它也只会返回“组合”部分,因为这将被插入到 accountSubstring 表中?所以它会将@Name 作为@s 非常感谢
  • @user19902020 。 . .那将是一个不同的问题。这回答了您在此处提出的问题。
  • 我创建了一个新问题link 非常感谢您的帮助。希望解释得更好
【解决方案2】:

查看您所做的更新,您可以这样做

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

【讨论】:

  • 非常感谢,但我需要它来返回单词 concat 并通过更改第一个单词进行迭代,直到所有 concats 完成。我需要它能够接收一个列,因为它需要执行 Account 表中“名称”列中的所有行。 Gordon 的上述答案有效,但我试图将其更改为正常运行,但一直给我错误
  • 您已经在Substring 列@user19902020 中找到了字词
  • 它只显示单词,它们不连接,我已经运行它,它也只适用于上述单词,但它需要在一列中。 “This is a sentence”这句话只是作为一个例子来说明它应该如何被分割/连接。以下是您的查询给我的内容:这是一个句子这是一个句子是这是一个句子a这是一个句子句子
  • 请@user19902020阅读并关注this
  • 我的问题/解释有问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多