[英]How can I create a conditional WHERE clause in SQL Server that returns multiple values?
我有以下 SQL 代码用于 SSRS 报告。 我简化了代码,因为原始查询要长得多。 有一个用户可以输入的参数@ARTICLE。 我想要做的是创建一个条件 WHERE 语句。 如果用户输入文章编号 (@ARTICLE),则查询应过滤 Table1 中与输入的文章编号 (@ARTICLE) 与另一个表中的“详细代码”匹配的 ID 匹配的 ID。 如果没有给出文章编号,则不要过滤(或跳过整个 WHERE 语句)
使用下面的代码,我收到以下错误:
子查询返回超过 1 个值。 当子查询跟随 =, ,=, <, <=, > 时,这是不允许的。 >= 或当子查询用作表达式时。
逻辑上它在没有 CASE 语句的情况下工作得很好,所以当只使用子查询来检查匹配的 ID 时。 但是,如果 @ARTICLE 参数有值,我只想返回匹配的 ID。 如果是 NULL 或空字符串,我想返回所有 ID(或跳过整个 WHERE 语句)。 如何在 WHERE 子句中包含允许返回多行的条件,给出以下示例?
我觉得我的方法很复杂,非常感谢任何帮助!
DECLARE @ARTICLE AS VARCHAR(50) = '1234567'
SELECT * FROM Table1
WHERE
Table1.ID IN (
CASE
WHEN ISNULL(@ARTICLE,'')<>'' THEN
(
SELECT ID
FROM Table2
WHERE detailcode IN (@ARTICLE)
)
ELSE Table1.ID
END
)
你是对的,你有点过于复杂了——如果你看一下LIKE
运算符,你可以这样做:
DECLARE @filter NVARCHAR(50) = '123456';
DECLARE @f NVARCHAR(100) = '%' + @filter + '%';
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField]
AND [t2].[detailCode] LIKE @f;
其中@filter
是存储过程的参数。
或者说明detailCode
为 null:
DECLARE @filter NVARCHAR(50) = '123456';
DECLARE @f NVARCHAR(100) = '%' + @filter + '%';
IF @filter != NULL
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField]
AND [t2].[detailCode] LIKE @f;
ELSE
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField];
我会检查@ARTICLE
是NULL
还是NOT NULL
并且您的子查询已完成,如下所示:
WHERE
ISNULL(@ARTICLE, '') = ''
OR
(
ISNULL(@ARTICLE, '') <> ''
AND ID IN
(
SELECT ID FROM Table2
WHERE detailcode = @ARTICLE
)
)
也许你可以做完全不同的事情,例如存在。
因此,当@ARTICLE is null or ''
或exists at least one row in table2 with this article
一行时,您将返回所有行
当变量为 null 或 '' 时, OR
将产生不进行过滤的效果
DECLARE @ARTICLE AS VARCHAR(50) = '1234567'
select t1.*
from table1 t1
where ( isnull(@ARTICLE, '') = ''
or
exists ( select 1 from table2 t2 where t2.detailcode = @ARTICLE )
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.