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

时间:2015-05-21 23:20:59

标签: sql sql-server stored-procedures

我有一张桌子'表格'列标题为'。 在我的存储过程中,我创建了一个临时表'#temp1'使用列' searchVals'。

将多个字符串解析为存储过程,字符串数量是可变的。

如果'标题'那么我想要实现的是选择一行。包含一个或多个searchVal'。但我还没能成功实现这一目标。

例如像

这样的东西

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

问题显然是IN不允许使用通配符,但如果确实如此,那就是我试图实现的结果类型。 堆叠OR也不起作用,因为#temp1中的行数是可变的。 谓词和自由文本搜索无法正常工作,因为表单数据库没有被正确编入索引。

我已经提出了我认为有效的解决方案,但我似乎无法正确构建它。该函数将从WHERE子句中调用并返回一个布尔值。对不起,如果在其他地方已经回答了这个问题,我确实进行了广泛的搜索。 下面是我提出的伪代码解决方案,我不确定可互换的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代码不一致且不正确。我将不胜感激任何会使我的代码工作的建议或更正。也欢迎更好的解决方案。 谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

但请记住,使用LIKE运算符确实会带来性能损失,因此如果可能,您将希望使用where子句减少表单表中的行数

答案 1 :(得分:0)

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

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