繁体   English   中英

如何在 SQL 服务器中创建返回多个值的条件 WHERE 子句?

[英]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];

我会检查@ARTICLENULL还是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM