Как избежать CTE в запросе? - PullRequest
0 голосов
/ 30 октября 2019

Я подготовил образец таблицы, чтобы продемонстрировать, чего я хочу достичь.

drop table #Temp
create table #Temp
(
    col1 nvarchar(50),
    col2 nvarchar(50),
    col3 nvarchar(50)
)
insert into #temp (col1,col2,col3) values (null, null, 'W')

Как избежать этого cte и получить такой же результат?

with cte as (
select COALESCE(col1,col2,col3) as result from #temp
)
select * from cte where result is not null

Ответы [ 2 ]

1 голос
/ 30 октября 2019

SQL Fiddle

Настройка схемы MS SQL Server 2017 :

create table Temp
(
    col1 nvarchar(50),
    col2 nvarchar(50),
    col3 nvarchar(50)
)
insert into temp (col1,col2,col3) values (null, null, 'W')
insert into temp (col1,col2,col3) values (null, null, null)
insert into temp (col1,col2,col3) values ('A', 'B', 'W')

Запрос 1 :

select * from temp
where COALESCE(col1,col2,col3) IS NOT NULL

Запрос 2 :

select CASE WHEN  COALESCE(col1,col2,col3) IS NULL THEN 'Undefined' ELSE
COALESCE(col1,col2,col3) END from temp

Результаты :

|   col1 |   col2 | col3 |
|--------|--------|------|
| (null) | (null) |    W |
|      A |      B |    W |
0 голосов
/ 30 октября 2019

Для вашего запроса это эквивалентно следующему 2 запроса

select  COALESCE(col1,col2,col3) as result
from    #Temp
where   COALESCE(col1,col2,col3) is not null

или

select  * 
from 
(
    select COALESCE(col1,col2,col3) as result from #Temp
) as D
where   result is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...