2013-06-20 8 views
0

У меня есть таблица вроде этого:Как выбрать идентификатор, first_not_null (value1), first_not_null (value2) .. на Postgresql

+--+---------+---------+ 
|id|str_value|int_value| 
+--+---------+---------+ 
| 1| 'abc' |   | 
| 1|   | 1 | 
| 2| 'abcd' |   | 
| 2|   | 2 | 
+--+---------+---------+ 

Мне нужно, чтобы получить это:

+--+---------+---------+ 
|id|str_value|int_value| 
+--+---------+---------+ 
| 1| 'abc' | 1 | 
| 2| 'abcd' | 2 | 
+--+---------+---------+ 

кажется мне нужно что-то вроде:

select id, first_not_null(str_value), first_not_null(int_value) 
from table 
group by id 

Есть ли приемлемый способ для этого? Я использую Postgresql 9.0.1.

Update: это должно работать с UUID типов, а также

+0

Если есть несколько ненулевых значений в ид, как бы вы определить, какой из них «первых»? –

+0

Нет. В любом случае мне нужно «любое» ненулевое значение. На самом деле я пытаюсь получить все идентификаторы, у которых все значения заполнены. – Alex

+0

Решение Zimi, скорее всего, будет правильным. –

ответ

0

Вы должны смотреть на http://www.postgresql.org/docs/8.1/static/functions-aggregate.html для агрегатных функций.

Я думаю, Макс должен сделать работу

EDIT: Рабочий пример

select id, max(col1), max(col2) from (
    select 1 as id, null as col1, 'test' as col2 
    union 
    select 1 as id ,'blah' as col1, null as col2 
) x group by id 
+0

Спасибо! Я использовал это как временное решение. Но я подозреваю, что будет еще несколько столбцов uuid_value, и ваше решение не подойдет. – Alex

+0

Я использовал max (uuid_value :: varchar (36)) с uuids. Это немного медленнее, но работает. Спасибо. – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^