我正在尝试构建一个简单的查询,该查询将允许用户根据人口统计信息过滤客户端列表。在我看来,这LIKE
将是最简单的解决方案,例如:
SELECT D.Name
FROM demographics D
WHERE D.City LIKE @cityVar
AND D.Sex LIKE @sexVar
AND D.Age LIKE @ageVar
...
使用组合框将变量传递到查询中。因此,如果用户决定不基于任何给定的参数进行过滤,我将直接传递'%'
给变量,从而有效地使WHERE
子句中的该行转义。
但是,如果我想返回包含已NULL
过滤字段中的值的行,则此方法不起作用。例如,如果D.Employer
的值为NULL
,则该客户失业。但传递'%'
给@employedVar
(意味着用户希望同时返回已雇用和待业的客户)将忽略D.Employer
is中的所有行NULL
。
我将如何构造该WHERE
子句的逻辑,以解决大量参数的问题,同时仍允许用户对任何给定参数进行转义过滤,并NULL
在适当的时候始终包含值?
最简单的是做这样的事情
SELECT D.Name
FROM demographics D
WHERE (D.City LIKE @cityVar OR @cityVar == '%')
AND (D.Sex LIKE @sexVar OR @sexVar == '%')
AND (D.Age LIKE @ageVar OR @ageVar == '%')
重要的是,不要使用类似
SELECT D.Name
FROM demographics D
WHERE ISNULL(D.City. '') LIKE @cityVar
AND ISNULL(D.Sex, '') LIKE @sexVar
AND ISNULL(D.Age, '') LIKE @ageVar
将值传递给函数将使其成功,因此SQL Server无法使用这些列上可能具有的任何索引。这将导致效率低下的查询计划和较差的性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句