首页 > 解决方案 > 检查十个字段中的任何两个是否不同(不为 NULL 或等于)

问题描述

我有一个包含(除其他外)十个字段的 SQL 查询,称它们为 v1、...、v10,我想对其进行测试。预期的情况是大多数为 NULL,其余的值都相等。我正在寻找的有趣(错误?)情况是至少有两个不相等的非 NULL 值。

有没有比这更好的方法

v1 != v2 or v1 != v3 or ... v8 != v9 or v8 != v10 or v9 != v10

二项式 (10, 2) = 总共 45 个条件?

除了不优雅之外,它似乎很脆弱——而且刚刚调试了一个问题,即长列表中的一个变量有错字,而不仅仅是学术问题。但是,如果这是唯一可行的方法……尽管如果列表扩展到 20 则就不那么好了。

标签: sqloracledrymaintainability

解决方案


UNPIVOT列到行,然后是GROUP BY您的主键和未透视列中COUNTDISTINCT值,以查看是否有多个唯一值:

甲骨文 11 设置

CREATE TABLE table_name ( id, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) AS
  SELECT 1, 'A', 'A',  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM DUAL UNION ALL
  SELECT 2, 'A', NULL, 'B',  NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM DUAL UNION ALL
  SELECT 3, 'A', NULL, 'A',  'A',  NULL, 'A',  'A',  'A',  'A',  'A'  FROM DUAL UNION ALL
  SELECT 4, 'A', NULL, 'A',  'A',  'B',  NULL, NULL, NULL, NULL, NULL FROM DUAL;

查询

SELECT id
FROM   table_name
UNPIVOT ( value FOR name IN ( c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) )
GROUP BY id
HAVING COUNT( DISTINCT value ) > 1

输出

| 身份证 |
| -: |
| 2 |
| 4 |

db<>在这里摆弄


推荐阅读