【问题标题】:TSQL Conditional Where using Temp Tables使用临时表的 TSQL 条件条件
【发布时间】:2017-07-24 19:11:12
【问题描述】:

我有一个过程,它接受一个 XML 选项字段数据字符串,并将值存储在临时表中(如果用户传递了任何内容)。

例如,如果用户选择他们想通过CountryDepartment 进行搜索,则这些临时表将包含数据,而City 将为空。

我要做的是创建一个where clause,它将使用这些临时表中的数据作为其逻辑。

    INSERT  INTO @users(QID)
    SELECT  QID
    FROM    Employees AS e
    WHERE   e.AreaID IN ( SELECT AreaID FROM @areas )
    AND     e.SiloID IN ( SELECT SiloID FROM @silos);

然而,在这种情况下,如果 @silos 为空,我不希望它成为逻辑的一部分,并且应该包含 e.SiloID 为任何内容的数据。

示例:

@区域

1、5、7

@筒仓

查询将是:

SELECT QID 
FROM Employees 
WHERE e.AreaID IN ( SELECT AreaID FROM @areas )
AND   e.SiloID = <anything here, we ignore this logic because the temp table was empty>;

【问题讨论】:

  • 如果我没记错的话,你在找:AND (@silos IS NULL OR e.SiloID IN (SELECT SiloID FROM @silos))
  • 添加一个变量来存储变量 silo 中的记录数,执行 Santi 上面所说的操作,但使用该变量等于 0 而不是 silos IS NULL。
  • @Santi - @silos IS NULL IS 在尝试以这种方式使用它时会引发错误。

标签: sql-server tsql stored-procedures sql-server-2012


【解决方案1】:

您的每个 where 条件都应检查该值是否在临时表中临时表为空。这将创建一个“条件过滤器”,仅在临时表中有记录时才缩小结果范围。

INSERT  INTO @users(QID)
SELECT  QID
FROM    Employees AS e
WHERE   ( 
            -- Areas
            NOT EXISTS (SELECT AreaID FROM @areas) 
            OR e.AreaID IN ( SELECT AreaID FROM @areas )
        ) 
        AND ( 
            -- Silos
            NOT EXISTS (SELECT SiloID FROM @silos) 
            OR e.SiloID IN ( SELECT SiloID FROM @silos )
        );

对于剩余的条件继续此模式。

【讨论】:

  • 谢谢,这正是我需要的。
【解决方案2】:

您可以使用其他人在 cmets 中提到的 rowcount 变量,也可以内联:

AND     (
  e.SiloID IN ( SELECT SiloID FROM @silos)
  OR NOT EXISTS(SELECT SiloID FROM @silos)
);

【讨论】:

  • 如何在我的WHERE 子句的主要第一部分使用它?你的是 AND 用于额外的字段检查,但 Areas 是我首先要寻找的,我需要应用这种相同风格的逻辑检查。当我尝试WHERE e.AreaID = ( 时,NOTOR 运算符抛出错误。
  • 您最初的问题没有提到您也希望在Areas 上使用相同的逻辑。它只对Silos提出了这个要求。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多