Oracle SQL多列数据对齐校验:忽略NULL值仅校验非空项
Oracle SQL 多列非空值一致性校验的简洁实现
要实现三列数据忽略NULL值的对齐校验,核心是判断所有非空项是否完全一致,无需编写大量CASE WHEN语句,这里提供两种简洁方案:
方案一:利用GREATEST和LEAST函数
Oracle的GREATEST和LEAST函数会自动忽略NULL值,仅对非空参数取最大/最小值。如果所有非空值一致,两个函数的结果必然相等;若存在不同的非空值,结果则不同。再结合全NULL的特殊情况处理即可:
SELECT col_1, col_2, col_3, CASE WHEN GREATEST(col_1, col_2, col_3) IS NULL THEN 'OK' WHEN GREATEST(col_1, col_2, col_3) = LEAST(col_1, col_2, col_3) THEN 'OK' ELSE 'ERROR' END AS Alignment FROM your_table;
逻辑说明
- 全NULL时,
GREATEST返回NULL,直接标记为OK - 存在非空值时,若所有非空值相同,最大最小值一致→
OK - 存在不同非空值时,最大最小值不同→
ERROR
方案二:利用集合去重计数
将三列的非空值收集到字符串列表,转成集合(自动去重)后,判断集合的元素数量是否≤1:
SELECT col_1, col_2, col_3, CASE WHEN CARDINALITY(SET(SYS.ODCIVARCHAR2LIST( CASE WHEN col_1 IS NOT NULL THEN col_1 END, CASE WHEN col_2 IS NOT NULL THEN col_2 END, CASE WHEN col_3 IS NOT NULL THEN col_3 END ))) <= 1 THEN 'OK' ELSE 'ERROR' END AS Alignment FROM your_table;
逻辑说明
SYS.ODCIVARCHAR2LIST是Oracle内置的字符串列表类型,仅收集非空值SET()函数对列表去重,CARDINALITY()获取集合元素数量- 元素数量≤1意味着所有非空值一致(或全空)→
OK,否则→ERROR
测试验证
用提供的示例数据测试,两种方案都会输出预期的Alignment结果:
| Col_1 | Col_2 | Col_3 | Alignment |
|---|---|---|---|
| ABC | ABC | ABC | OK |
| ABC | ABC | NULL | OK |
| ABC | NULL | NULL | OK |
| NULL | ABC | ABC | OK |
| NULL | ABC | NULL | OK |
| NULL | NULL | NULL | OK |
| ABC | XYZ | ABC | ERROR |
| XYZ | XYZ | ABC | ERROR |
| ABC | NULL | XYZ | ERROR |
| XYZ | ABC | ABC | ERROR |
| NULL | NULL | XYZ | OK |
| XYZ | XYZ | NULL | OK |
| NULL | NULL | XYZ | OK |
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

