【问题标题】:Checking distinct values on column level检查列级别的不同值
【发布时间】:2019-04-08 13:39:31
【问题描述】:

我的查询中有四列。我的要求是检查所有列的值是否不同,然后只选择结果。

我已经编写了这个查询,它工作正常。但我只是想知道是否有更好或更快捷的方法来实现这一目标

select FO, AFO, CO, ACO from mytable 
where 
(fo<>afo or (fo is null or afo is null))
and 
(fo<>co or (fo is null or co is null))
and 
(fo<>aco or (fo is null or aco is null))
and 
(afo<>co or (afo is null or co is null)) 
and 
(afo<>aco or (afo is null or aco is null))
and 
(co<>aco or (co is null or aco is null))

【问题讨论】:

  • 能否提供一组示例数据,您对预期结果的描述有点混乱。
  • @PawanNogariya 你能上传一些示例数据和输出吗
  • 就快捷方式而言(假设您的列是 varchar 类型)(foafo or (fo is null or afo is null))可以写成 COALESCE(fo, 'fo' ) COALESCE(afo, 'afo')
  • @DimiTakis 这不是一个好主意。即使列上有索引,这也会强制进行全表扫描
  • @PanagiotisKanavos 哦,好吧,不同意这一点 - 两者的查询计划是相同的 - 只要在你身边尝试,你就会看到

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

嗯。 . .您似乎希望这四个值不同或NULL。另一种方法使用apply

select t.*
from mytable t cross apply
     (select count(*)
      from (values (t.afo), (t.fo), (t.co), (t.aco)
           ) v(val)
      where val is not null
      having count(*) = count(distinct val)
     ) x;

这会删除 NULL 值,然后检查其余的值是否都不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多