如何在WHERE子句中使用IN运算符设置可选参数?

时间:2018-01-22 22:28:59

标签: sql sql-server

我有一个存储过程有两个可选参数。这两个参数都是逗号分隔的字符串,我想在IN运算符中使用。

假设我有一些像这样的SQL:

@ManagersCommaDelimited VARCHAR(MAX) = NULL,
@EmployeesCommaDelimited VARCHAR(MAX) = NULL

SELECT t1.*, t2.Field1
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t1.id = t2.table1id
WHERE (@ManagersCommaDelimited IS NOT NULL AND t1.ManagerId IN (@ManagersCommaDelimited))
AND (@EmployeesCommaDelimited IS NOT NULL AND t1.EmployeeId IN (@EmployeesCommaDelimited))

如果这些参数中的任何一个为NULL或空格,我想忽略具有IN运算符的部分。

因此,如果ManagersCommaDelimited为NULL,那么我想返回包含所有记录的记录,如果ManagersCommaDelmited不是NULL,那么我想返回仅包含逗号分隔字符串参数中的管理器的记录。

如何在MS SQL中完成此操作?

1 个答案:

答案 0 :(得分:0)

如果要与数据子集进行比较,则只能使用IN。
OP解决方案是检查字符串的存在,因此使用CharIndex

https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql

WHERE (ISNULL(@ManagersCommaDelimited, '') <> ''
AND CHARINDEX(@ManagersCommaDelimited, CAST(t1.ManagerId AS varchar(max)) > 0))  --- if there is a match of text then will return the position