Sql 找出遗漏的单词

Sql 找出遗漏的单词,sql,sql-server,Sql,Sql Server,您好,我正在创建一个模块,以从SQL 如果我有一根绳子 “男人,只有一个年轻人,船,只有成年人” 我想在表中匹配这些单词tbl\u missingwords ID Keyword Synonym 1 One young men only young men,young adults,adults only 2 One young women only young women,young adults,adults only 3 Do

您好,我正在创建一个模块,以从
SQL

如果我有一根绳子

“男人,只有一个年轻人,船,只有成年人”

我想在表中匹配这些单词
tbl\u missingwords

ID  Keyword                 Synonym 
1   One young men only      young men,young adults,adults only
2   One young women only    young women,young adults,adults only
3   Domestic cat            Domestic animals,pats,animal themes
4   Domestic dog            Domestic animals,pats,animal themes
5   Adventure               recreation,persuit
6   Boat                    mode of transport,transport 
那么结果应该是

ID  Keyword                 Synonym 
1   One young men only      young men,young adults
6   Boat                    mode of transport,transport

请帮助在
SQL

中选择这些缺少的单词,首先创建一个用户定义的函数来拆分输入字符串

功能-fn_分割

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(   
   position int IDENTITY PRIMARY KEY,
   value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
BEGIN 
SET @index = CHARINDEX(@delimiter , @text) 
IF (@index = 0) AND (LEN(@text) > 0) 
  BEGIN  
    INSERT INTO @Strings VALUES (@text)
      BREAK 
  END 
IF (@index > 1) 
  BEGIN  
    INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
    SET @text = RIGHT(@text, (LEN(@text) - @index)) 
  END 
ELSE
  SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
然后尝试以下sql查询

查询

declare @str as varchar(max)

set @str='Man,one young men only,boat,adults only'

select ID,min(keyword) as keyword,
case when right(min([Synonym]),1) = ','
then replace(left(min([Synonym]),len(min([Synonym]))-1),',,',',')
else replace(min([Synonym]),',,',',') end as [Synonym]
from
(
    select ID,Keyword,value,replace([Synonym],Value,'') as [Synonym]
    from fn_split(@str,','),
    tbl_missingwords
    where Keyword in (select value from fn_split(@str,','))
)t
group by ID;

您已经就此提出了许多问题。重新设计表结构现在应该是您的首要任务。无论如何,下面是我使用拆分器和交叉应用的解决方案:


dbo.SplitStrings\u XML
的定义已经在前面问题的第二部分中

@Felix Pamittan再问你一个问题。。请看一看这个问题,为什么结果中的
ID=1
同义词中不包含
仅成年人
?@Felix Pamittan感谢您的重播……先生,实际上
仅成年人
已在字符串中使用,这就是您将多变量数据存储在单个字符串中的原因。将字符串拆分成行并进行单个联接,这是一个糟糕的设计。如果可能,您应该删除同义词列,并在tbl_missingwords中的行之间创建多对多关系。好的,先生,我正在尝试..将告诉您此函数是否适用于区分大小写的单词@Ullasits不区分大小写。是的!!它使用相同的功能:)非常感谢您的回答,我将尝试重新设计表格结构
DECLARE @str VARCHAR(MAX) = 'Man,one young men only,boat,adults only'

DECLARE @tblStr AS TABLE(word VARCHAR(MAX))

INSERT INTO @tblStr
    SELECT Item
    FROM dbo.SplitStrings_XML(@str, ',')

;WITH CteMissingWords(ID, Keyword, Synonym) AS(
    SELECT
        w.ID,
        w.Keyword,
        s.Item
    FROM tbl_missingwords w
    CROSS APPLY dbo.SplitStrings_XML(w.Synonym, ',') s
)
SELECT
    tmw.ID, tmw.Keyword, x.Synonym
FROM tbl_missingwords tmw
CROSS APPLY(
    SELECT STUFF((
        SELECT ',' + cmw.Synonym
        FROM CteMissingWords cmw
        WHERE
            cmw.ID = tmw.ID
            AND cmw.Synonym NOT IN(SELECT word FROM @tblStr)
            AND cmw.Keyword IN(SELECT word FROM @tblStr)
        FOR XML PATH('')
    ), 1, 1, '')
)x(Synonym)
WHERE x.Synonym IS NOT NULL