【问题标题】:PostgreSQL insert from SQL SELECT statement fails because of expression type text由于表达式类型文本,从 SQL SELECT 语句插入 PostgreSQL 失败
【发布时间】:2018-07-03 17:21:19
【问题描述】:

我在 PostgreSQL 将数据插入新表时遇到了一个简单的错误。我想使用一个简单的查询,因为这个表只会存储不同维度的平均值。我希望我的 avg 列是双精度的。我的插入语句是

insert into benchmark_table 
(select avg(s.percentage_value) as avg, s.metric_name, s.category 
from some_table s group by s.category, s.metric_name);

此命令失败并出现以下错误:

错误:列“avg”是双精度类型,但表达式是 type text LINE 2: ...(s.percentage_value) as double precision) as avg, s.metric_n... ^ 提示:您需要重写或转换表达式。

所以我尝试将我的 avg 列转换为双精度:

INSERT into benchmark_table 
(SELECT cast(avg(s.percentage_value) as double precision) as avg, s.metric_name, s.category 
FROM some_table s group by s.category, s.metric_name);

我也试过

insert into benchmark_table 
(Select  avg(s.percentage_value)::double precision as avg, s.metric_name, s.category 
from summary_view_output s group by s.category, s.metric_name);

但是,我收到关于 avg 是文本的相同错误。我知道从我的查询返回的是默认文本的结果集,但我没有看到任何方法可以将其转换为另一种数据类型以供我的外部 INSERT 语句使用。

【问题讨论】:

  • 尝试将 ::double 精度更改为 ::float?另外,表格字段的序号位置可能与您的选择不同。尝试使用“插入 benchmark_table(avg, metric_name, category)”
  • 是的,这行得通。随意写这个作为答案,我会接受

标签: postgresql


【解决方案1】:

尝试将 ::double 精度更改为 ::float 并查看是否有效。另外我注意到您没有在 Insert 子句中包含字段名称。可能 benchmark_table 字段的序号位置和 select 语句中的不一样。 尝试使用。

insert into benchmark_table( avg, metric_name, category)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多