替代多个AND运算符

时间:2016-04-18 11:43:12

标签: sql-server tsql

在T-sql中使用多个AND运算符是否有更清洁(更好)的替代方法。

例如

use Portal
go
SELECT
U.Id,
U.FirstName,
U.LastName,
U.Email,
U.Gender, 
U.Country

FROM AspNetUsers U
WHERE (U.M01 >= 80 and U.M02 >= 80 and u.M03 >= 80 AND U.M04 >= 80)

3 个答案:

答案 0 :(得分:1)

不,如果结果取决于您在WHERE中拥有的列。如果有好的索引,它也会很快(这个查询的好索引是

create index [some name] on AspNetUsers (M01, M02, M03, M04) include (Id, FirstName, LastName, Email, Gender, Country)

但是这个查询看起来很奇怪,可能是设计/规范化的问题

答案 1 :(得分:1)

如果您需要AND,则AND是正确的运算符。

AND是高效的,因为它可以在它获得单个错误时立即放弃。 查询优化器(通常)足够聪明,可以先查找容易出错的内容。

OR不是那么有效,所以有时你会重构去除OR但我从来没有理由重构AND。

如果值发生变化,那么为了方便可能会使用它,但它不应该影响执行

declare @count int = 80;
SELECT
U.Id,
U.FirstName,
U.LastName,
U.Email,
U.Gender, 
U.Country
FROM AspNetUsers U
WHERE U.M01 >= @count 
  and U.M02 >= @count  
  and u.M03 >= @count  
  AND U.M04 >= @count;

答案 2 :(得分:1)

很少有选项可以简化这种特定的选择语法,但很难说如果不了解整个上下文以及您对更好/更清洁的定义,它们是否有意义......

让我们假设更清洁/更好的意味着选择没有连结算子"对你而言。

一些可能的选择:

  1. 创建一个预过滤AspNetUsers表的视图。然后您的查询语法可以简化为:

    选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsersPerfiltered

  2. 将过滤逻辑移动到将检查条件的专用功能。然后您的查询语法可以简化为:

    选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsers 在哪里myFunction(M01,M02,M03,M04)= 1

  3. 创建将在行插入/更新期间或某些后台进程中设置的其他列(标志)。然后您的查询语法可以简化为:

    选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsers 在哪里FlagColumn = 1

  4. HTH