查询包含逗号分隔值的列

时间:2018-01-19 23:19:33

标签: sql-server csv

我试图弄清楚为什么我的where子句会返回所有行。

我使用也包含csv的变量查询包含csv的列。我已经构建了一个存储函数来在csv上拆分变量,并返回一个包含一行的表,其中包含我想在LIKE运算符右侧拥有的内容。

示例:

存储的功能:

ALTER Function [dbo].[storedFunction] 
    (@Fields VARCHAR(MAX),
     @Field_Name VARCHAR(MAX) = '')  
RETURN @Tbl_Fields Table (FIELD Varchar(max))  
AS
BEGIN
    DECLARE @FIELD varchar(max) = REPLACE(@Fields, ',', '%''' + ' AND ' + 
@Field_Name + ' Like ' + '''%');

    INSERT INTO @Tbl_Fields 
        SELECT '''%' + @FIELD + '%'''

    RETURN
END

使用存储的功能:

BEGIN
    DECLARE @variable varchar(max) = 'variable1, variable3';
END

SELECT field 
FROM storedFunction(@variable, 'main_csv_field');

返回'%variable1%' AND main_csv_field Like '%variable3%'

我的简化查询:

BEGIN
    DECLARE @variable varchar(max) = 'variable1, variable3';
END

SELECT main_csv_field 
FROM table
WHERE (main_csv_field LIKE (SELECT field 
                            FROM storedFunction(@variable, 'main_csv_field');

返回

variable1,variable2,variable3,variable4,...
variable2,variable4,...
variable1,variable3,...

我的问题是这个最后一个查询返回表中的所有行,而不管值是否匹配。如果我要复制并粘贴从存储函数返回的值,我将得到我需要的数据。

这里有什么/有什么区别?

1 个答案:

答案 0 :(得分:0)

感谢@Obie和@ AllanS.Hansen我知道从哪里开始寻找解决方法。它非常粗糙,但我想在兔子洞太远之前发布一个解决方案:

DECLARE variable1 varchar(max) = '' --around 9 passed from code

DECLARE @query nvarchar(max);
DECLARE @column_list varchar(max) = 'column1, column2, etc'
--one of each of the tests per variable passed from code
DECLARE @variable1_test nvarchar(max) = (SELECT CASE WHEN @variable = '' THEN '%' ELSE (SELECT * from dbo.stored_function(@variable, 'column_name')) END);
END;

SET @query = ' SELECT ' + @column_list + ' 
        FROM table_name 
        WHERE variable LIKE ''' + @variable_test + ''' '
EXECUTE sp_executesql @query;
print(@query); --This is just to see the resulting query, which helped me a ton

刺激!现在我必须测试它。