oracle 检查多列中的数据对齐,但不要将NULL视为未对齐

des4xlb0  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(127)

我有三列数据,我想使用ORACLE SQL检查它们的数据对齐情况,但有一个特定条件,即在这三列中允许NULL条目,但我想在对齐检查方面 * 完全忽略 * NULL条目,只报告ERROR条件 *,即非NULL条目之间存在对齐错误... *
一些例子-

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

给定可以找到NULL条目、NULL条目对或NULL数据的三个条目的组合,我可以看到可以使用CASE WHEN的大量组合来 * 粗略地生成 * 第4个对齐列,但我希望可能有一个ORACLE SQL进程可以消除大量的CASE WHEN语句,假设我只想检查三列组合中存在"* some data *"的地方的数据对齐...
如能提供上述任何帮助,将不胜感激。
谨致问候。

n3schb8v

n3schb8v1#

这里有一个选择这是SQL*Plus,因此我将其设置为当该列中没有值时按字面显示NULL(以便看起来像您的示例)。

SQL> set null NULL
SQL>
SQL> select col1, col2, col3,
  2    case when (col1 = col2 or col1 is null or col2 is null) and
  3              (col1 = col3 or col1 is null or col3 is null) and
  4              (col2 = col3 or col2 is null or col3 is null)
  5         then 'OK'
  6         else 'ERROR'
  7    end alignment
  8  from test;

COL1  COL2  COL3  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

13 rows selected.

SQL>
dced5bon

dced5bon2#

您可以尝试使用单个CASE表达式,该表达式指定:

  • "OK",当列3 =列2且列2 =列1时
  • "错误",否则

可以使用COALESCE函数处理NULL值,但是需要使用三个条件而不是两个条件,如下所示。

SELECT tab.*, 
       CASE WHEN COALESCE(COL_1, COL_2, 'NULL') = COALESCE(COL_2, COL_1, 'NULL')
             AND COALESCE(COL_2, COL_3, 'NULL') = COALESCE(COL_3, COL_2, 'NULL')
             AND COALESCE(COL_1, COL_3, 'NULL') = COALESCE(COL_3, COL_1, 'NULL')
            THEN 'OK'
            ELSE 'ERROR'
       END AS Alignment
FROM tab

检查here演示。

    • 注意**:如果您有4个字段而不是3个,则需要添加检查所有配对字段的条件,因此(1,3),(2,4),(3,4),(4,1)。

相关问题