【发布时间】: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