在列字符串中搜索单词并列出这些单词

时间:2018-01-09 22:27:20

标签: sql sql-server

有两个表,表1包含列W_ID and word。表2列N_ID and note。必须列出表{1}列中包含的NID列中包含的所有word字段(简单部分),并列出其他列中的字词而不重复Note 。这意味着使用N_ID来连接STUFF列中针对该特定words的所有Note。我尝试使用

  

使用CONTAIN

的完整文本索引

但它只允许一次搜索一个单词。任何建议我如何使用N_ID来实现这一目标。 enter image description here

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

您可以根据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.');