我在下面的场景中进行了全文搜索:
我想查找完全包含我指定的术语的行,而不是更多。
我的专栏如下所示:
Col1
apples oranges grapes
apples oranges
apples strawberries
apples strawberries peaches
apples但我只想搜索包含苹果和/或草莓的行,而不搜索其他行。
我的结果如下所示:
1| apples strawberries
2| apples 谢谢您:)
发布于 2012-10-26 04:56:50
经过多次尝试,我自己弄明白了:(我还编辑了问题,以揭示我遇到的真正问题):
SELECT * FROM Table WHERE CONTAINS(Col1, 'apples or strawberries')
AND (Col1 NOT LIKE '%[^ apples or strawberries ]%');发布于 2012-10-26 00:29:50
我真的不确定你的table1Col1在这里起什么作用,所以下面的可能不足以完全解决你的问题,但它应该能让你入门:
首先,您需要一个split function,例如:
CREATE FUNCTION dbo.Split (@Input NVARCHAR(MAX), @Delimiter NVARCHAR(1))
RETURNS @T TABLE (OutputValue NVARCHAR(MAX))
AS
BEGIN
WITH CTE AS
( SELECT [OutputValue] = SUBSTRING(@Input, 1, CHARINDEX(@Delimiter, @Input)),
[InputValue] = SUBSTRING(@Input, CHARINDEX(@Delimiter, @Input) + 1, LEN(@Input)) + ' '
UNION ALL
SELECT [OutputValue] = SUBSTRING([InputValue], 1, CHARINDEX(@Delimiter, [InputValue])),
[InputValue] = SUBSTRING([InputValue], CHARINDEX(@Delimiter, [InputValue]) + 1, LEN([InputValue]))
FROM CTE
WHERE LEN([InputValue]) > 0
)
INSERT @T
SELECT DISTINCT OutputValue
FROM CTE
RETURN;
END然后,您可以使用类似以下内容:
DECLARE @T TABLE (Col1 NVARCHAR(MAX));
INSERT @T VALUES ('apples oranges grapes'), ('apples oranges'), ('apples strawberries');
DECLARE @StringToCheck NVARCHAR(MAX) = 'apples oranges bananas grapes'
SELECT Col1
FROM @T
CROSS APPLY dbo.Split(Col1, ' ') spl
LEFT JOIN dbo.Split(@StringToCheck, ' ') chk
ON chk.OutputValue = spl.OutputValue
GROUP BY Col1
HAVING COUNT(spl.OutputValue) = COUNT(chk.OutputValue)或者如果您需要专门排除项目
DECLARE @T TABLE (Col1 NVARCHAR(MAX));
INSERT @T VALUES ('apples oranges grapes'), ('apples oranges'), ('apples strawberries');
DECLARE @StringToCheck NVARCHAR(MAX) = 'apples oranges bananas grapes',
@StringToExlude NVARCHAR(MAX) = 'strawberries grapes'
SELECT Col1
FROM @T
CROSS APPLY dbo.Split(Col1, ' ') spl
LEFT JOIN dbo.Split(@StringToCheck, ' ') chk
ON chk.OutputValue = spl.OutputValue
LEFT JOIN dbo.Split(@StringToExlude, ' ') exc
ON exc.OutputValue = spl.OutputValue
GROUP BY Col1
HAVING COUNT(spl.OutputValue) = COUNT(chk.OutputValue)
AND COUNT(exc.OutputValue) = 0https://stackoverflow.com/questions/13058286
复制相似问题