创建物化视图时如何转换数据类型并使用 CASE 更改值? (PostgreSQL)
How to CAST datatype and also change value with CASE when creating MATERIALIZED VIEW? (PostgreSQL)
我需要在 table 上创建一个实体化视图。其中一列是非常有问题的。我需要在查询中更改它的值和数据类型。想请教各位,在创建matview的时候fluent流程是怎样的?
我有一堆 table 作为某些解码过程的输出。为了使这些过程更有效,我必须创建例如测试查询(以及这里不相关的其他一些东西)。好吧,总而言之,我需要创建 table 的具体化视图,正如已经提到的那样。其中一列的数据类型错误(returns TEXT 而不是 VARCHAR)。幸运的是我可以很快地解码它们,但是类型转换是另一回事。
问题是,由于缺乏经验,我无法立即找到更改值和类型的正确方法!我已经有两个解决方案,但它们看起来不太优雅:
1) 我预先创建了一个 table 并在 SELECT 部分之后更改了列值,而不是从 table 中创建了 matview(对于几十行)
2) 我 CAST 了 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' .我得到的结果与我的预期不符,但或多或少是正确的。
有什么理由不能为 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;
我需要在 table 上创建一个实体化视图。其中一列是非常有问题的。我需要在查询中更改它的值和数据类型。想请教各位,在创建matview的时候fluent流程是怎样的?
我有一堆 table 作为某些解码过程的输出。为了使这些过程更有效,我必须创建例如测试查询(以及这里不相关的其他一些东西)。好吧,总而言之,我需要创建 table 的具体化视图,正如已经提到的那样。其中一列的数据类型错误(returns TEXT 而不是 VARCHAR)。幸运的是我可以很快地解码它们,但是类型转换是另一回事。
问题是,由于缺乏经验,我无法立即找到更改值和类型的正确方法!我已经有两个解决方案,但它们看起来不太优雅:
1) 我预先创建了一个 table 并在 SELECT 部分之后更改了列值,而不是从 table 中创建了 matview(对于几十行)
2) 我 CAST 了 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' .我得到的结果与我的预期不符,但或多或少是正确的。
有什么理由不能为 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;