Есть ли способ обновить все значения в таблице PostgreSQL, которые равны нулю с 0 - PullRequest
1 голос
/ 29 мая 2020

У меня есть большая таблица, которая не соответствует лучшим методам организации данных, поэтому я не могу сделать простую

update table set (...cols) = 0 where (...cols) is null

, потому что имена столбцов - это месяцы года da sh a год до 5 лет. т.е. 20 января, 21 января, 22 января и т. д. c.

Мне интересно, есть ли там команда, которая по существу выполняла бы

update table set all data = 0 where data is null

Я понимаю, что это противоречит принципам SQL, но я надеюсь, что есть что-то, что делает то, что я ожидал от этой команды.

1 Ответ

1 голос
/ 29 мая 2020

Не существует чистого SQL способа сделать это (кроме перечисления всех столбцов вручную).
Вы можете использовать pl/pgsql:

DO
$$
    DECLARE
        schema_ TEXT := 'public';
        table_ TEXT := 't';
        column_list TEXT;
        coalesced_list TEXT;
    BEGIN
        -- Build up 2 strings containing
        --   (col1, col2, col3, ....)
        --   (COALESCE(col1, 0), COALESCE(col2, 0), ...)
        SELECT
            '(' || string_agg(quote_ident(column_name), ', ') || ')',
            '(' || string_agg('COALESCE(' || quote_ident(column_name) || ', 0)', ',') || ')'
        FROM information_schema.columns
        WHERE table_name = table_
          AND table_schema = schema_
        INTO column_list, coalesced_list
        ;
        -- Update the table, settings columns (c1, c2, ...) to (COALESCE(c1, 0), COALESCE(c2, 0), ...)
        -- changing all null values to zeroes
        EXECUTE format($query$
            UPDATE %I.%I
            SET %s = %s
        $query$, schema_, table_, column_list, coalesced_list);
    END
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...