2013-03-26 3 views
0

Окружение:PostgreSQL Update Column на основе нескольких условий

Я использую PostgreSQL 9.1.2 и имеют базовую таблицу, как показано ниже, где у меня есть 4 двоичных столбцов, которые могут принимать значения Y или N. Эти столбцы также в основном содержат нулевые значения, которые я обозначаемые как «-» в таблице ниже:

Binary Col 1 Binary Col 2 Binary Col 3 Binary Col 4 Summary Col 
    ------------ ------------ ------------ ------------ ----------- 
1.  Y    N    -    N    1 
2.  -    Y    N    Y    2 
3.  N    N    -    N    0 
4.  -    -    -    -    - 
5.  Y    Y    Y    Y    4   

Проблема:

Я хочу, чтобы включить S ummary Столбец в мою таблицу, которая заполняется на основе числа «Y», которое встречается в этих 4 двоичных столбцах. Я привел 5 примеров в таблице выше, чтобы продемонстрировать желаемый результат. Важно отметить, что я хочу уметь отличать случаи, такие как запись 3 (нет «Y») из таких случаев, как запись 4 (все двоичные столбцы нулевые). Это одноразовое усилие, и у меня нет проблем с производительностью относительно того, как этот дублирующий столбец повлияет на скорость транзакций моей таблицы.

Я просмотрел несколько примеров PostgreSQL «Обновить таблицу», а также проверил руководство here. Тем не менее, я не мог найти пример процедуры обновления с несколькими условиями, но я считаю, что здесь требуется.

Возможно, я полностью ошибаюсь, и для решения требуется функция SQL или триггер, любые советы или предложения?

+0

Что вы подразумеваете под бинарной колонкой? Каков его тип? –

ответ

4

SQL Fiddle

select 
    c1, c2, c3, c4, 
     (coalesce(c1, '') = 'Y')::integer 
     + (coalesce(c2, '') = 'Y')::integer 
     + (coalesce(c3, '') = 'Y')::integer 
     + (coalesce(c4, '') = 'Y')::integer 
    total_Y, 
     (c1 is null)::integer 
     + (c2 is null)::integer 
     + (c3 is null)::integer 
     + (c4 is null)::integer 
    total_null 
from t 
+0

Спасибо, я добавил 'coalesce' к тегам вопроса. – Rhubarb

1

Как счастливому совпадению, функция сумма точно поведение, которое вы ищете. Вам просто нужно преобразовать значения в строки:

UPDATE some_table SET summary = (SELECT SUM(v::int) FROM (VALUES (col1),(col2),(col3),(col4)) as x(v)); 
+1

Не могли бы вы объяснить логику? – harry

+0

4 столбца расширяются как отношение одного столбца с 4 строками, логические значения преобразуются в int, false становятся 0 и true становятся равными 1, тогда значения суммируются для возврата желаемого результата. Это зависит от поведения суммарной суммы SQL, которая определена для пропуска значений null и возвращает значение null, когда все агрегированные значения равны нулю. –

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