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

标签 sql sql-server

我有一个包含几列的表格。我需要将其中一些列相互比较,并删除它们相互匹配或为 NULL 的行。换句话说,我需要只保留存在除 NULL 之外的差异的行。 (如果重要的话,我将针对要比较的列数不同的表运行几次,有时是非常多的列,因此只关注三列的查询将不起作用。)

所以,如果我的 table 是:

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

最佳答案

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)

这是 fiddle http://sqlfiddle.com/#!3/ea7172/8

关于sql - 查询删除列匹配或为 NULL 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403844/

相关文章:

c++ - 无法使用 soci 库连接到 SQL Server

sql-server - 从 SQL 子集中返回最大值

sql - 带 insert 语句的 where 子句

python - Django pymssql 迁移

mysql - 填补 Mysql 中数据范围之间的空白

SQL 列/行分组

sql - postgresql如何获取重复计数和对应的值

python - 在一个键列上加入两个数据帧/错误 : 'columns overlap but no suffix specified'

c# - 在 SqlCommand 中调用函数

日期时间列表累积频率的 SQL 查询