select语句中的sql where子句问题

时间:2010-07-15 17:00:17

标签: sql tsql sql-server-2008 select

我正在使用带有Windows Server 2008 Enterprise的SQL Server 2008 Enterprise。我有一个名为“Book”的数据库表,它有很多列,在这个问题中有三列很重要,它们是

  • 作者,varchar;
  • 国家,varchar;
  • Domain,varchar。

我想用以下逻辑编写一个商店程序,但我不知道如何编写(因为复杂的查询条件),如果有人可以为我写一个样本,我会很感激吗?

输入参数:p_author为varchar,p_country为varchar,p_domain为varchar

查询条件:

  1. 如果从输入中指定了p_author,那么其作者列LIKE%p_author%满足条件的任何行,如果未从输入中指定p_author,则每行都满足此条件;
  2. 如果从输入中指定了p_country,那么其Country列= p_country满足条件的任何行,如果未从输入中指定p_country,则每行都满足此条件;
  3. 如果从输入中指定了p_domain,那么满足其Domain列LIKE%p_domain%的任何行,如果未从输入中指定p_domain,则每行都满足此条件;
  4. 我想要返回的结果(必须满足以下所有条件):

    • 记录符合条件1或2;
    • 记录必须符合条件3;
    • 返回不同的行。

    例如,符合条件1和条件3的记录可以返回,符合条件2和条件3的记录可以返回。

    提前谢谢, 乔治

2 个答案:

答案 0 :(得分:2)

基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。

阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:

Dynamic Search Conditions in T-SQL by by Erland Sommarskog

The Curse and Blessings of Dynamic SQL by Erland Sommarskog

如果您拥有正确的SQL Server 2008版本(SQL 2008 SP1 CU5(10.0.2746)及更高版本),则可以使用此小技巧实际使用索引:

由于使用LIKE,因此没有太多可以做的,但是如果你使用了相等,你可以在查询中添加OPTION(RECOMPILE),参见Erland的文章,SQL Server将解析OR在根据局部变量的运行时值创建查询计划之前从(Column = @Param+'%' OR @Param='') AND ...内部开始,如果不使用LIKE,则可以使用索引。

答案 1 :(得分:1)

如果我理解正确,以下内容应该有效:

 SELECT * 
FROM Books
WHERE (
   ((Author LIKE '%' + @p_author + '%' OR @p_author = '') OR 
   (Country LIKE '%' + @p_country + '%' OR @p_country = ''))
   AND (@p_author <> '' OR @p_country <> '')
) AND 
(Domain LIKE '%' + @p_domain + '%' OR '%' @p_domain = '')