使用 CONTAINS 中 STRING_SPLIT 函数的值

问题描述 投票:0回答:1

我正在尝试创建 SQL 查询(通过全文搜索),该查询将返回包含多个列的多个术语。

下面是我设法创建的内容:

SELECT * FROM table
WHERE EXISTS (
SELECT value FROM STRING_SPLIT('Sample text to be splitted', ' ')
WHERE CONTAINS((column1, column2, column3), value))

我不知道为什么由于语法错误而无法在包含内使用“值”:““值”附近的语法不正确”。我正在使用 SQL Server,我有全文索引,唯一的问题是分割字符串中的“值”列,我可以使用显式字符串(例如“文本”)代替“值”,然后它可以工作,但这不是解决方案。

sql sql-server contains
1个回答
0
投票

从多单词字符串中手动准备的选择语句将如下所示:

SELECT * FROM table
WHERE CONTAINS((column1, column2, column3), 'Sample') OR
      CONTAINS((column1, column2, column3), 'text') OR
      CONTAINS((column1, column2, column3), 'to') OR
      CONTAINS((column1, column2, column3), 'be') OR
      CONTAINS((column1, column2, column3), 'split');

所以你可以看到,如果你的输入字符串是 12 个单词,或者 123 个单词,那么查询的结构会发生很大的变化。因此,您需要一种方法来处理这种可变性 - 这需要“动态 sql”,即构建所需 sql 的脚本,然后执行该 sql。要准备这样的变量选择语句需要迭代分割值,如本示例所示:

DECLARE @SearchText NVARCHAR(MAX) = 'Sample text to be split';
DECLARE @SplitValues TABLE (Value NVARCHAR(100)); -- Adjust the length as needed

INSERT INTO @SplitValues
SELECT value FROM STRING_SPLIT(@SearchText, ' ');

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'SELECT * FROM table WHERE';

WITH CTE AS (
    SELECT Value FROM @SplitValues
)
SELECT @SQL = @SQL + '  CONTAINS((column1, column2, column3), ''' + Value + ''') OR'
FROM CTE;

SET @SQL = LEFT(@SQL, LEN(@SQL) - 2); -- this removes the trailing 'OR'
EXEC sp_executesql @SQL;

nb此脚本可能会创建效率低下且运行缓慢的查询

© www.soinside.com 2019 - 2024. All rights reserved.