sql-server – T-SQL – 值与列表中的至少一个项不匹配

我有一个MS SQL表,其中包含多个列,每个列用于不同的员工角色,每个列都有一个相应的列,指示该角色中的当前员工是处于活动状态,休假,终止等.由于依赖于外部数据源,字段没有真正规范化.

我希望运行一个查询来返回所有行中至少有一个’is active’列不等于’ACTIVE’.除Active之外还有几个可能的值.

我知道有一个更长的方法可以做到这一点

SELECT * FROM MYTABLE
WHERE IsActive1 <> 'ACTIVE' OR
      IsActive2 <> 'ACTIVE' OR
      IsActive3 <> 'ACTIVE' OR
      IsActive4 <> 'ACTIVE' OR
... etc

只是想知道是否有更短的方式,可能更有效的方式来做到这一点.我已经看到了很多用于在多个列中查找匹配的解决方案,但没有找到用于查找非匹配的解决方案.

最佳答案 我不知道这更优雅,但你可以这样做:

where replace(IsActive1 + IsActive2 + IsActive3 + . . .,
              'ACTIVE', '') <> ''

请注意,如果值可能为NULL,那么您需要将其替换为其他值.此外,这假设字符串本身不为空.

编辑:

如果您希望有效地执行此操作并希望代码看起来不错,请添加计算列并在该列上构建索引:

alter table mytable
    add IsAllActive as (case when IsActive1 = 'ACTIVE' and
                                  IsActive2 = 'ACTIVE' and
                                  . . .
                             then 'ACTIVE'
                             else 'INACTIVE'
                        end);

create index mytable_IsAllActive on mytable(IsAllActive);

您可能还想将其他相关列添加到索引中.

点赞