基于包含一个或多个其他字符串的字符串的选择

Selection based on string containing one or many other strings

我有一个 table 'forms' 列 'title'。 在我的存储过程中,我创建了一个带有 'searchVals'.

列的临时 table '#temp1'

存储过程解析多个字符串,字符串个数可变

如果 'title' 包含一个或多个 'searchVal',我想要实现的是选择一行。但是我还没有成功实现这个。

例如这样的东西

SELECT title FROM #temp1 WHERE title IN ('%'+(SELECT searchVal FROM #temp1)+'%')

问题显然是 IN 不允许通配符,但如果允许的话,这就是我想要实现的结果类型。 堆叠 OR 也不起作用,因为 #temp1 中的行数是可变的。 谓词和自由文本搜索不起作用,因为表单数据库未正确编制索引。

我提出了我认为有效的解决方案,但我似乎无法正确构建它。该函数将从 WHERE 子句和 return 布尔值调用。很抱歉,如果这个问题在其他地方得到了回答,我确实进行了广泛的搜索。 下面是我提出的伪代码解决方案,我不确定可互换的 SQL 代码。

DECLARE FUNCTION dbo.checkVal(searchVal column, formTitle varchar)
RETURNS boolean
AS
BEGIN
    WHILE (not end of column)
        IF formTitle LIKE '%'+searchVal+'%'
            RETURN true
        END
    END
RETURN FALSE
END

抱歉,我的 SQL 代码不一致且不正确。如果有任何建议或更正可以使我的代码正常工作,我将不胜感激。也欢迎更好的解决方案。 谢谢。

您可以在 JOIN 语句中使用 LIKE 运算符:

SELECT DISTINCT f.*
FROM forms f
JOIN #temp1 t ON f.title LIKE '%' + t.column + '%'

但请记住,使用 LIKE 运算符确实会影响性能,因此您需要尽可能使用 where 子句 table 来减少表单中的行数

如何通过 EXISTS() 检查每一行表格?

SELECT * 
FROM forms f 
WHERE EXISTS
(
    SELECT * 
    FROM #temp1 
    WHERE f.title LIKE '%' + searchVals + '%'
)