Как выполнить CAST тип данных, а также изменить значение с помощью CASE при создании MATERIALIZED VIEW? (PostgreSQL)

Мне нужно создать МАТЕРИАЛИЗИРОВАННЫЙ ВИД на столе. Один из столбцов очень проблемный. Мне нужно изменить его значения и тип данных в запросе. Я хотел бы спросить вас, как быстро это делается при создании matview?

У меня есть куча таблиц как результат некоторых процессов декодирования. Чтобы сделать эти процессы более эффективными, мне нужно создать, например, тестовые запросы (и некоторые другие вещи, не относящиеся к этому вопросу). Итак, в общем, мне нужно создать МАТЕРИАЛИЗИРОВАННЫЙ ВИД таблиц, как уже упоминалось. Один из столбцов содержит неверные данные с типом wrond (возвращает TEXT вместо VARCHAR). К счастью, я мог быстро их расшифровать, но приведение типов - это совсем другое.

Проблема в том, что из-за недостатка опыта я не могу найти правильный способ сразу изменить значения и тип! У меня было два решения, но они выглядят не очень элегантно:

1) Я предварительно создал таблицу и изменил значение столбцов после раздела SELECT, чем я создал matview из этой таблицы (это медленно и сложно для десятков строк)

2) Я КИСТИЛ сам оператор CASE, в котором я меняю значения, и закрыл его с помощью END AS VARCHAR (он работал хорошо, за исключением того, что имена полей исчезли из matview, и это меня очень огорчило).

Таким образом, second_column останется без преобразования как ТЕКСТ:

CREATE MATERIALIZED VIEW IF NOT EXISTS some_schema.some_matview AS
    (SELECT
        first_column,
        CASE
            WHEN second_column = '1' THEN 'A'
            WHEN second_column = '2' THEN 'B'
        END AS second_column,
        third_column,
    FROM base_schema.base_table);

Таким образом, second_column, вероятно, отображается как VARCHAR, но имена полей не отображаются в matview:

CREATE MATERIALIZED VIEW IF NOT EXISTS some_schema.some_matview AS
    (SELECT
        first_column,
        CAST(CASE
            WHEN second_column = '1' THEN 'A'
            WHEN second_column = '2' THEN 'B'
        END AS VARCHAR),
        third_column,
    FROM base_schema.base_table);

Я также пробовал некоторые другие предположительно правильные формы созвездия CAST-CASE, но все они привели меня к различным ошибкам.

В итоге: мне нужно, чтобы second_column отображался как VARCHAR в моем matview со значениями «A» или «B» вместо «1» или «2», которые являются ТЕКСТАМИ. Результаты, которые я получаю, не соответствуют моим ожиданиям, однако они более или менее верны.


person SandorBoss    schedule 04.07.2019    source источник


Ответы (1)


Есть ли причина, по которой вы не можете присвоить вызов CAST:

CREATE MATERIALIZED VIEW IF NOT EXISTS some_schema.some_matview AS
SELECT
    first_column,
    CAST(CASE
        WHEN second_column = '1' THEN 'A'
        WHEN second_column = '2' THEN 'B'
    END AS VARCHAR) AS second_column,    -- change here
    third_column,
FROM base_schema.base_table;
person Tim Biegeleisen    schedule 04.07.2019
comment
УХ ТЫ! Спасибо! Я указываю, что на этот раз это был мой Неожиданный '{'. - person SandorBoss; 04.07.2019
comment
Да, когда я увидел зеленую галочку, у меня тоже было похожее лицо O :-O - person Tim Biegeleisen; 04.07.2019