【发布时间】:2014-07-24 21:18:06
【问题描述】:
我有一个 MS SQL 表,其中包含多个列,每个列代表不同的员工角色,每个列对应的列指示该角色的当前员工是否处于活动状态、休假、终止等。由于依赖于外部数据来源,这些字段并没有真正标准化。
我正在寻找运行查询以返回至少一个“活动”列不等于“活动”的所有行。除了 Active 之外,还有几个可能的值。
我知道这样做的较长方法之一是
SELECT * FROM MYTABLE
WHERE IsActive1 <> 'ACTIVE' OR
IsActive2 <> 'ACTIVE' OR
IsActive3 <> 'ACTIVE' OR
IsActive4 <> 'ACTIVE' OR
... etc
只是想知道是否有更短的方法,可能更有效的方法来做到这一点。我已经看到很多解决方案可以跨多个列查找匹配项,但没有一种解决方案可以查找不匹配项。
【问题讨论】:
-
你为什么要长一点?您没有列出数据库引擎,但是在此查询上使用索引会很困难。除非你的数据库引擎支持一些技巧,比如 SQL Server 的过滤索引之类的,否则无论你做什么,你都会进行表扫描。
-
列可以包含
NULL值吗? -
MS SQL Server db 引擎隐含在标题 (TSQL) 中。我在问我的路是否比其他路更长。告诉我你所说的这些 SQL Server 技巧:)
-
@GordonLinoff 是的,NULL 是可能的
-
我不确定您使用的是哪个版本的 SQL Server。如果是 2008 年或更高版本,请查看过滤索引,它们基本上是具有 where 子句的索引。然后,您将拥有一个仅包含“非活动”行的索引
标签: sql-server tsql select