【问题标题】:Search for a word in the column string and list those words在列字符串中搜索一个单词并列出这些单词
【发布时间】:2018-01-09 22:27:19
【问题描述】:

有两个表,表 1 的列 W_ID and word。表 2 与列 N_ID and note。必须列出所有在表 1 word 列中找到的单词包含在 Note 列(简单部分)中的所有 NID,并且还要在另一列中列出这些单词而不重复 N_ID。这意味着使用STUFF 连接在Note 列中找到的所有words 特定N_ID。我尝试使用

使用 CONTAIN 的全文索引

但它一次只允许搜索一个单词。任何建议我如何使用while loop 来实现这一点。

【问题讨论】:

  • 你不想在这里循环。您需要进行连接,然后汇总这些结果。当然,您在前导和尾随都使用通配符时会遇到困难,但希望这只是为了学习,因为这种类型的东西在现实世界中大部分时间都毫无用处。
  • 您希望在最终结果中显示的表 1 中的字数是否达到上限?
  • @AndrewO'Brien - 不
  • @SeanLange - 这不是为了学习目的,它是我工作的公司的一个实时项目,我们应该能够检测到笔记中使用的标记词。这就是为什么我们创建了一个包含所有标记单词列表的单独表格。
  • 啊,明白了。我可能会使用字符串拆分器,然后加入你的坏词表。然后使用 STUFF 重新组装。

标签: sql sql-server


【解决方案1】:

如果您希望为 N_ID 显示最大数量的单词,您可以旋转它。您可以通过连接它们将它们放在一个列中,但我建议不要这样做。这是一个支点,每个 N_ID 最多支持 4 个单词。您可以根据需要进行调整。 You can view the SQL Fiddle for this here.

SELECT
  n_id,
  [1] AS word_1,
  [2] AS word_2,
  [3] AS word_3,
  [4] AS word_4
FROM (
  SELECT
    n_id,
    word,
    ROW_NUMBER() OVER (PARTITION BY n_id ORDER BY word) AS rn
  FROM tbl2
  JOIN tbl1 ON
    tbl2.note LIKE '%'+tbl1.word+'[ ,.?!]%'
  ) AS source_table
  PIVOT (
    MAX(word)
    FOR rn IN ([1],[2],[3],[4])
  ) AS pivot_table

*更新了连接以防止查找空格或标点来声明单词的结尾。

【讨论】:

  • 注释中使用的单词没有限制。可以有很多。所以我不确定在这种情况下这是否是正确的方法。感谢您的帮助。非常感谢
  • 如果您想要显示的字数没有限制,您可以使用动态 SQL 查找匹配的最大字数,然后使用所需的透视列数创建此查询。话虽如此,您可能需要考虑对要显示的字词设置上限。作为阅读报告的人,我不想读完前十几个字。
【解决方案2】:

您可以根据charindex 函数的正向结果将您的表连接在一起。

在 SQL 2017 中,您可以运行:

SELECT n_id, string_agg(word)
FROM words
inner join notes on 0 < charindex(words.word, notes.note);

在 SQL 2017 之前,没有 string_agg,因此您需要使用 stuff,这比较棘手:

select
stuff((
  SELECT ', ' + word
  FROM words
  where 0 < charindex(words.word, notes.note)
  FOR XML PATH('')
  ), 1, 2, '')

来自笔记;

我使用了以下架构:

CREATE table WORDS
(W_ID int identity primary key
,word varchar(100)
);

CREATE table notes
(N_ID int identity primary key
,note varchar(1000)
);

insert into words (word) values
('No'),('Nope'),('Nah');

insert into notes (note) values
('I am not going to do this. Nah!!!')
,('It is OK.');

【讨论】:

  • 我们没有 SQL 2017,我尝试将 sql 代码与 Stuff 一起使用,但没有成功。它只返回一列,一个单词重复了很多次。谢谢你的帮助。非常感谢
  • @Excited_to_learn 你确定吗?我对此进行了测试,它返回了您所说的正确为我寻找的内容。
  • 当然这会返回误报。请注意,对于不包含 No 作为单词的字符串值,这将返回“No”。如果评论中有“Nothing”,它将返回“No”和“Not”。如果评论类似于“Hannah 今天非常有帮助”,它将返回 Nah。
  • 我不得不稍微调整一下代码,它确实有效,但@SeanLange 你是对的,它确实返回误报。有没有办法在搜索确切的单词时考虑前导和尾随空格或/和前导逗号、点和感叹号?
  • 如果你添加一个前导空格,如果找到的单词在开头,那将是不可能的。感叹号适用于有限的样本数据,但在实际数据中甚至不是一个合理的考虑因素。
猜你喜欢
  • 2014-03-25
  • 2021-06-22
  • 2013-10-22
  • 2018-08-15
  • 2011-12-27
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多