代码之家  ›  专栏  ›  技术社区  ›  Steve Lorimer

PostgreSQL:SELECT INTO正在更改字段的数据类型

  •  1
  • Steve Lorimer  · 技术社区  · 6 年前

    我有一张桌子如下:

    CREATE TABLE IF NOT EXISTS foo_raw
    (
        time   TIMESTAMPTZ NOT NULL,
        volume INTEGER,                  <-- note source field is of type integer
        price  DOUBLE PRECISION
    );
    

    COPY foo_raw(time,volume,price) FROM 'raw_data.csv' DELIMITER ',' CSV
    

    然后我做一个 SELECT INTO 我正在合并一个新表 time

    选择进入

    SELECT
        time, 
        SUM(volume)::integer AS volume,          <-- note typecast to integer here
        SUM(volume * price) / SUM(volume) AS price
    INTO
        foo
    FROM
        foo_raw
    GROUP BY
        time
    ORDER BY
        time;
    

    如果我描述一下我的新桌子,我会发现 volume 字段的类型为 numeric ,不是 integer .

    pg=# \d foo
                       Table "public.foo"
     Column |           Type           | Collation | Nullable | Default 
    --------+--------------------------+-----------+----------+---------
     time   | timestamp with time zone |           | not null | 
     volume | numeric                  |           |          |     
     price  | double precision         |           |          | 
    

    你会在我的日记里记下 选择进入 我试着把结果打印出来 SUM(volume)

    问题

    如何强制字段为类型 整数 ?

    2 回复  |  直到 6 年前
        1
  •  3
  •   garysieling    6 年前

    SUM 将数字的数据类型更改为更大的值,这样加起来就不会产生溢出的数字:

    bigint表示smallint或int参数,numeric表示bigint参数,否则与参数数据类型相同

        2
  •  1
  •   Joe Love    6 年前

     SELECT
         time, 
         SUM(volume)::integer AS volume, 
     here
         SUM(volume * price) / SUM(volume) AS price
     INTO
         foo
     FROM
         foo_raw
     GROUP BY
         time
     ORDER BY
       time;
    

    如果您真的关心结果集的数据类型,我会适当地强制转换每一列。