Замените Union All на сервер Or Sql - PullRequest
3 голосов
/ 07 марта 2020

У меня есть таблица ниже с некоторыми примерами данных

Create table dbo.Test_2020
(
 id int identity(1,1),
 level_cd_1 varchar(10) null,
 level_cd_2 varchar(10) null
)

insert into dbo.Test_2020

select 'cd_1_01',null
union all
select 'cd_1_02',null
union all
select 'cd_1_03','cd_2_01'
union all
select null, 'cd_2_02'
union all
select null, 'cd_2_03'
union all
select 'cd_1_04', 'cd_2_04'

А ниже приведен запрос, используемый для получения ненулевых значений из обоих столбцов: level_cd_1 & level_cd_2

 select id, level_cd_1 as level_cd from Test_2020 where level_cd_1 is not null
 union all
 select id, level_cd_2  from Test_2020 where level_cd_2 is not null

Вопрос может я получаю тот же результат, используя условие ИЛИ вместо того, чтобы дважды запрашивать одну и ту же таблицу, вот запрос, который я пытался написать, но не возвращаю тот же набор результатов, что и запрос выше

 select id, coalesce(level_cd_1,level_cd_2)as leve_cd from Test_2020 where 
  (level_cd_1 is not null or level_cd_2 is not null)

Дайте мне знать, если это возможно.

1 Ответ

3 голосов
/ 07 марта 2020

Как насчет CROSS APPLY

Пример

Select A.ID
      ,B.*
 From  Test_2020 A
 Cross Apply ( values ( level_cd_1 )
                     ,( level_cd_2 )
             ) B(level_cd)
 Where level_cd is not null

Возвращает

ID  level_cd
1   cd_1_01
2   cd_1_02
3   cd_1_03
3   cd_2_01
4   cd_2_02
5   cd_2_03
6   cd_1_04
6   cd_2_04
...