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