查询以删除列匹配或为NULL的行

时间:2015-05-22 18:46:38

标签: sql sql-server

这看起来很简单,但我找不到任何东西。任何帮助表示赞赏。

我有一个包含多个列的表。我需要将这些列中的一些列相互比较并删除它们彼此匹配的行或者为NULL。换句话说,我需要将行保留在除NULL之外的其他区域。 (如果重要的话,我会对比较不同数量的列的表运行几次,有时会列很多列,因此那些只关注三列的查询将无效。)

所以,如果我的表是:

ID  TITLE   VALUE_1 VALUE_2 VALUE_3
1   One     AAA     NULL    NULL
2   Two     NULL    AAA     AAA
3   Three   AAA     AAA     AAA
4   Four    NULL    NULL    NULL
5   Five    AAA     BBB     CCC
6   Six     AAA     BBB     NULL
7   Seven   NULL    DDD     EEE
8   Eight   AAA     AAA     BBB

运行查询后,我想要

ID  TITLE   VALUE_1 VALUE_2 VALUE_3
5   Five    AAA     BBB     CCC
6   Six     AAA     BBB     NULL
7   Seven   NULL    DDD     EEE
8   Eight   AAA     AAA     BBB

再次感谢您的时间。

3 个答案:

答案 0 :(得分:3)

select * from table
where v1 <> v2 or v1 <> v3 or v2 <> v3

这将返回任何一对都有TRUE的行。因此,使用NOT IN包围该谓词将提供所需的删除设置:

delete t where id not in(select id from t where v1 <> v2 or v1 <> v3 or v2 <> v3)

这是小提琴http://sqlfiddle.com/#!3/ea7172/8

答案 1 :(得分:1)

 Delete from tablename 
      where (Value_1 is Null And value_2 is null) 
             or (Value_2 is Null And value_3 is null)
             or (Value_1 is Null And value_3 is null)
             or (Value_1 = value_2)
             or (Value_1 = value_3)
             or (Value_3 = value_2)

如果有两列null或任何两列匹配,则应该能够删除。如果您想知道

,sql server中没有字符串比较功能

答案 2 :(得分:0)

您可以在ISNULL声明

中使用DELETE

Where IsNull (Value_1, 'SomeValueThatWillNeverBeInTheTable') = IsNull (Value_2, 'SomeValueThatWillNeverBeInTheTable')