首页 > 解决方案 > 用于遍历数据的 SQL 查询

问题描述

我有一张如下所述的桌子

COLUMN_NAME OLD_VALUE   NEW_VALUE
:-----      :-------    :------------
FRST_NM     MICHAEL     TEST
LST_NM      DAVIS       TEST_IQVIA
MID_NM      AUSTIN      TEST 

我已经使用了下面提到的 SQL

       select 
     (  case when COLUMN_NAME = 'FRST_NM' then NVL2 (new_value , new_value  ,  old_value )  else NULL  end )  FRST_NM,
      (  case when COLUMN_NAME = 'LST_NM' then NVL2 (new_value , new_value  ,  old_value )  else NULL end )  LST_NM,
         (  case when COLUMN_NAME = 'MID_NM' then NVL2 (new_value , new_value  ,  old_value )  else NULL end )  MID_NM
         from TEST_TABLE

获得如下所述的输出。

FRST_NM  LST_NM       MID_NM 
:------- :--------    :----------
TEST     NULL         NULL
NULL     TEST_IQVIA   NULL
NULL     NULL         TEST

预期的输出将是

FRST_NM  LST_NM       MID_NM 
:------  :-------     :-------
TEST     TEST_IQVIA   TEST

谁能指导我

标签: sqloracle

解决方案


只需使用聚合:

select max(case when COLUMN_NAME = 'FRST_NM' then coalesce(new_value, old_value) end) as FRST_NM,
       max(case when COLUMN_NAME = 'LST_NM' then coalesce(new_value, old_value ) end)  as LST_NM,
       max(case when COLUMN_NAME = 'MID_NM' then coalesce(new_value, old_value) end) as  MID_NM
from TEST_TABLE;

笔记:

  • nvl2()在这里不合适。尽管您可以使用nvl(),但您不妨使用 SQL 标准函数coalesce()
  • else null是多余的——NULL是默认值。

推荐阅读