【问题标题】:How to CAST datatype and also change value with CASE when creating MATERIALIZED VIEW? (PostgreSQL)创建 MATERIALIZED VIEW 时如何 CAST 数据类型并使用 CASE 更改值? (PostgreSQL)
【发布时间】:2019-07-04 13:10:14
【问题描述】:

我需要在一个表上创建一个 MATERIALIZED VIEW。其中一列是非常有问题的。我需要在查询中更改其值和数据类型。想请教一下,它在创建matview的时候流畅的流程是什么?

我有一堆表作为一些解码过程的输出。为了使这些过程更有效,我必须创建例如测试查询(以及这里不相关的其他一些东西)。好吧,总而言之,我需要创建一个已经提到的表的 MATERIALIZED VIEW。其中一列具有错误类型的错误数据(返回 TEXT 而不是 VARCHAR)。幸运的是,我可以快速解码它们,但类型转换是另一回事。

问题在于,由于缺乏经验,我无法立即找到更改值和类型的正确方法!我有两个解决方案,但它们看起来不太优雅:

1)我预先创建了一个表并在 SELECT 部分之后更改了列值,而不是从该表中创建了 matview(对于几十行来说它很慢而且很复杂)

2) 我对 CASE 语句本身进行了转换,我在其中更改了值并使用 END AS VARCHAR 将其关闭(它运行良好,只是字段名称从 matview 中消失了,这让我非常难过)。

这样 second_column 未转换为 TEXT:

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 星座,但所有这些都导致我犯了不同的错误。

总而言之:我需要在 matview 中将 second_column 转换为 VARCHAR,其值为“A”或“B”,而不是“1”或“2”,它们是 TEXT。我得到的结果与我的预期不符,但它们或多或少是正确的。

【问题讨论】:

    标签: postgresql casting case materialized-views


    【解决方案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;
    

    【讨论】:

    • 哇!谢谢!我指出,这一次是我的“意外的'{'”。
    猜你喜欢
    • 2020-01-03
    • 2023-01-16
    • 2017-02-28
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2011-11-02
    • 2019-12-25
    相关资源
    最近更新 更多