2016-10-27 3 views
0

folgenden nehmen an meinem Tisch ist: -Spalten erhalten, die in allen Zeilen denselben Wert hat

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

ich aufnehmen will aus jeder Spalte, die einen einzelnen Wert in alle Reihe hat.

Für die obigen Beispieldaten, ich will:

1,NULL,3 

als das Ergebnis.

Antwort

2

Sie Aggregation und case verwenden können. Für Ihre Daten:

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; 

Ich empfehle min() und max() statt count(distinct) verwenden. Letzteres neigt dazu, schlechte Leistung zu haben.

+1

Man muss sich nur vor Augen halten, wie Nullen natürlich behandelt werden, aber das gilt auch für die Zählung (distinct ...). –

+0

danke. Könntest du bitte erklären, wie das hier besser ist? – nit710

+1

@ nit710: Wenn Sie einen Index für die Spalten haben, kann min() oder max() in ziemlich konstanter Zeit ausgewertet werden, unabhängig davon, wie viele Zeilen die Tabelle hat. count() muss durch alle Zeilen gehen, um herauszufinden, wie viele es sind. –

2

Sie können dies tun, indem eine Zählung deutliche tun:

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; 
Verwandte Themen