我需要根据参数'@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
答案 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的答案。