我有一个简单的查询,可以获取日期范围内所有订单的列表
这就是我查询的WHERE
子句的样子
WHERE o.Company_Code = LEFT(@Site,2)
AND o.Division_Code = RIGHT(@Site,3)
AND o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
ORDER BY
o.date_entered DESC
它通过读取参数站点来选择哪个公司,该站点的值类似于“ 09001”(在此查询生成的报告中选择)。
我想添加该功能以便能够查看所有公司的所有订单。因此,我在报表中添加了一个参数选项“全部”,其值为“ 00000”。
这是我的新WHERE
子句。
WHERE
o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
AND ((@Site = '00000') OR (o.Company_Code = LEFT(@Site, 2)
AND o.Division_Code = RIGHT(@Site, 3)))
ORDER BY
o.date_entered DESC
这个想法是,如果站点参数为00000,则它不应检查订单的公司或部门代码。如果不是00000,那么它会定期检查它。
使用硬编码值运行此查询似乎可以正常工作,并且几乎可以立即为我提供结果,但是当我尝试将其作为报表运行时,它需要几分钟的时间,并且经常崩溃。
答案 0 :(得分:2)
这可能是关于AND和OR的操作顺序。
尝试一下:
WHERE
o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
AND ((@Site = '00000')
OR
(o.Company_Code = LEFT(@Site,2) and o.Division_Code = RIGHT(@Site,3)))
order by o.date_entered desc