2016-10-27 3 views
0

предположим следующие мой стол: -получить столбцы, которые имеют одинаковое значение во всех строках

COL1 | COl2 | COL3 
-----|----- |----- 
1 | 2 | 3 
1 | 2 | 3 
1 | 4 | 3 

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

Для указанных образцов данных, я хочу:

1,NULL,3 

как результат.

ответ

2

Вы можете использовать агрегацию и case. Для ваших данных:

select (case when min(col1) = max(col1) then min(col1) end) as col1, 
     (case when min(col2) = max(col2) then min(col2) end) as col2, 
     (case when min(col3) = max(col3) then min(col3) end) as col3 
from t; 

Я настоятельно рекомендую использовать min() и max() вместо count(distinct). Последний, как правило, имеет низкую производительность.

+1

Просто нужно остерегаться того, как будут обрабатываться нули, но это относится и к счету (отчетливому ...). –

+0

спасибо. Не могли бы вы объяснить, как это лучше? – nit710

+1

@ nit710: если у вас есть индексы в столбцах, min() или max() могут быть оценены в довольно много времени независимо от количества строк таблицы. count() должен пройти через все строки, чтобы узнать, сколько их есть. –

2

Вы можете сделать это, делая счет отчетливый:

select 
    case when count(distinct col1) = 1 then min(col1) end as col1, 
    case when count(distinct col2) = 1 then min(col2) end as col2, 
    case when count(distinct col3) = 1 then min(col3) end as col3 
from tbl 
2
select case when count(distinct col1) = 1 then max(col1) else null end, 
     case when count(distinct col2) = 1 then max(col2) else null end, 
     case when count(distinct col3) = 1 then max(col3) else null end 
from table; 
Смежные вопросы