如何在 psql 中使用 `create temp table as` 建立类型?
How to establish types with `create temp table as` in psql?
假设我正在尝试将一些数据动态加载到这样的 psql 脚本中。我的第一步是使用动态加载的数据创建临时 table。
create temp table data (id, date, value1, value2, value3) as (
values
(1002178, '2022-05-10', 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
);
如您所见,我有一个 date
列,表示为字符串...
现在我想使用这个日期列来加入脚本中的一些现有数据,但为了做到这一点,我必须稍后通过做一些 date::date
事情来转换它.但是我在脚本其余部分的许多不同部分都使用了这个数据集,我认为在创建临时 table 时只转换一次会更干净,这样我就没有了一遍又一遍地施放它。
所以问题是:在 psql 中创建临时 table 时如何转换列的类型?
我已经尝试过 create temp table data (id int, date date, value1 int, value2 int, value3 int)
之类的东西,但这给了我一个语法错误..即使我在 documentation
中看到它是如何完成的
使用 create table ... as select ...
时无法定义列类型
但是转换 first 行的值就足够了,因为它们决定了所有的数据类型:
create temp table data (id, date, value1, value2, value3) as
values
(1002178, '2022-05-10'::date, 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
;
我能想到的唯一其他选择是将其分为两个语句:
create temp table data (id int, date date, value1 int, value2 bigint, value3 int);
insert into data
values
(1002178, '2022-05-10', 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
;
假设我正在尝试将一些数据动态加载到这样的 psql 脚本中。我的第一步是使用动态加载的数据创建临时 table。
create temp table data (id, date, value1, value2, value3) as (
values
(1002178, '2022-05-10', 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
);
如您所见,我有一个 date
列,表示为字符串...
现在我想使用这个日期列来加入脚本中的一些现有数据,但为了做到这一点,我必须稍后通过做一些 date::date
事情来转换它.但是我在脚本其余部分的许多不同部分都使用了这个数据集,我认为在创建临时 table 时只转换一次会更干净,这样我就没有了一遍又一遍地施放它。
所以问题是:在 psql 中创建临时 table 时如何转换列的类型?
我已经尝试过 create temp table data (id int, date date, value1 int, value2 int, value3 int)
之类的东西,但这给了我一个语法错误..即使我在 documentation
使用 create table ... as select ...
但是转换 first 行的值就足够了,因为它们决定了所有的数据类型:
create temp table data (id, date, value1, value2, value3) as
values
(1002178, '2022-05-10'::date, 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
;
我能想到的唯一其他选择是将其分为两个语句:
create temp table data (id int, date date, value1 int, value2 bigint, value3 int);
insert into data
values
(1002178, '2022-05-10', 4065894, 3823810, 242084),
(983666, '2022-05-10', 4022131, 3697020, 325111),
(965416, '2022-05-08', 2805982, 2534836, 271146),
(1002181, '2022-05-08', 2378400, 2209774, 168626),
(1002179, '2022-05-08', 1414636, 1331042, 83594),
(1002184, '2022-05-08', 1448815, 1361643, 87172),
(1002185, '2022-05-08', 1483795, 1411564, 72231),
(1002180, '2022-05-08', 1263884, 1194289, 69595),
(26, '2022-05-08', 1710917, 1439627, 271290),
(991458, '2022-05-07', 2111973, 2000600, 111373)
;