在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)
答案 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)
很少有选项可以简化这种特定的选择语法,但很难说如果不了解整个上下文以及您对更好/更清洁的定义,它们是否有意义......
让我们假设更清洁/更好的意味着选择没有连结算子"对你而言。
一些可能的选择:
创建一个预过滤AspNetUsers表的视图。然后您的查询语法可以简化为:
选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsersPerfiltered
将过滤逻辑移动到将检查条件的专用功能。然后您的查询语法可以简化为:
选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsers 在哪里myFunction(M01,M02,M03,M04)= 1
创建将在行插入/更新期间或某些后台进程中设置的其他列(标志)。然后您的查询语法可以简化为:
选择 ID, 名字, 姓, 电子邮件, 性别, 国家 来自AspNetUsers 在哪里FlagColumn = 1
HTH