当参数='否'时如何选择值为No或NULL的行,而当参数='Yes'时如何选择值为'Yes'的行

时间:2019-06-20 17:17:08

标签: sql sql-server reporting-services ssrs-2012

我需要根据参数'@HotList'选择行。

当“ @HotList” =“是”时,我需要拉出所有包含“ co.ro_HotList”字段为“是”值的行 当'@HotList'='No'时,我需要拉出所有包含'co.ro_HotList'字段值为'No'或null的行

我可以仅根据参数选择值是“是”或“否”的行,但是无法弄清楚如何在参数为“否”时选择空行。如何修改提供的代码来实现这一目标?

我尝试在where子句中使用case语句,但是没有运气。

SELECT ds.*                     
FROM Rotex_DailyShipmentNotShip ds
left outer join CRM_MSCRM..SalesOrder co ON ds.SOP#=co.Name 
WHERE co.ro_HotList = @HotList

4 个答案:

答案 0 :(得分:1)

在以下位置尝试:

ISNULL(co.ro_HotList,'No') = @HotList

ISNULL将对第二个输入求值为空,因此在您的情况下,所有空都将被视为“否”。

答案 1 :(得分:0)

基思(Keith)答案是正确的答案,但是出于完整性考虑,您可以尝试CASE,这就是使用CASE的方法。

  WHERE CASE WHEN co.ro_HotList IS NULL 
             THEN 'No'
             ELSE co.ro_HotList
        END  = @HotList

答案 2 :(得分:0)

您可以编写如下所示的过滤条件:

SELECT ds.*                     
FROM Rotex_DailyShipmentNotShip ds
left outer join CRM_MSCRM..SalesOrder co ON ds.SOP#=co.Name 
WHERE @HotList = 'Yes' and co.ro_HotList = 'Yes'
   OR @HotList = 'No' and (co.ro_HotList = 'No' or co.ro_HotList is null)

答案 3 :(得分:0)

对OP问题的几个答案是有效的,因为它们返回了预期的结果,但是大多数答案效率不高,因为它们阻止了正确使用索引。

将列名包含在诸如case表达式或函数之类的表达式中会阻止SQL Server使用索引。

带有OR运算符和参数条件的谓词也会妨碍有效的执行计划。

有几种有效的方式构造查询:

添加计算列

添加一个计算列,例如:

ALTER TABLE添加HotList AS ISNULL(ro_HotList,'No')

并将其编入索引。然后,查询将变得更简单且对索引友好:

WHOE HotList = @HotList

智能客户端应用程序

客户端应用程序可能足够聪明,可以执行以下操作(伪代码)

If HostListParameter is "No" then execute the query:
   SELECT <column list>
   FROM Whatever
   WHERE ro_HostList = 'No' OR ro_HostList IS NULL
Else execute this other query:
   SELECT <column list>
   FROM Whatever
   WHERE ro_HostList = @HotList
  Invalid parameter

结合逻辑使用T-SQL批处理

代替执行单个select语句,而是使用逻辑执行批处理

IF @HostList = 'No'
BEGIN
   SELECT <column list>
   FROM Whatever
   WHERE ro_HostList = 'No' OR ro_HostList IS NULL 
END
ELSE
BEGIN
   SELECT <column list>
   FROM Whatever
   WHERE ro_HostList = @HotList
END

使用存储过程

您可以创建一个存储过程,该存储过程执行与前面的T-SQL批处理相同的逻辑

使用OPTION(RECOMPILE)

添加OPTION(重新编译)

在Impaler答案中添加OPTION(RECOMPILE)会导致可以使用索引的更好的执行计划,但是也会阻止计划重用。

但是很少使用低选择性的非覆盖指标

如果一列包含的值很少,则非覆盖索引几乎没有用。

在这种情况下,我认为该列只能包含“是”,“否”或NULL。因此,建立索引不会提高性能。最好的答案是KeithL的答案。