PostgreSQL将varchar数组中的列更改为pair(varchar,integer)数组

时间:2017-04-10 03:47:45

标签: arrays postgresql alter

现在我有一个varchar数组(nullable& no default value), 并希望将其转换为pair(varchar,integer)数组。 对于整数值,现在只设置为0。

例如,["a", "b"]将为[("a", 0), ("b", 0)]

我已经知道我可以通过以下方式创建配对类型:

CREATE TYPE keycount AS (key VARCHAR, count INTEGER);

但不知道如何使用SET来修改列。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

首先创建类型

CREATE TYPE keycount AS (key VARCHAR, count INTEGER);

现在你需要创建强制转换..

CREATE FUNCTION text_to_keycount(a text)
RETURNS keycount AS
$$
  SELECT ($1, 0)::keycount
$$ LANGUAGE sql;

CREATE CAST (text AS keycount) WITH FUNCTION text_to_keycount(text);

SELECT ARRAY['asdf','asdf']::text[]::keycount[];

现在您可以创建表格并转换类型USING

CREATE TABLE foo ( a text[] );
INSERT INTO foo (a) VALUES
  ( ARRAY['1','2','3'] );
ALTER TABLE foo
  ALTER COLUMN a
    SET DATA TYPE keycount[]
    USING CAST (a AS keycount[]);

答案 1 :(得分:0)

如果keycount列中的所有行都包含有效数据,即没有任何类似' {" abc",""}的行',然后以下工作。如果列中存在任何无效数据,则必须首先清除该数据,然后才能更改列类型。

诀窍是创建一个临时对列,用数据填充它,删除旧列&将临时列重命名为原始列。

这是必需的,因为Postgresql无法弄清楚如何自动将VARCHAR []转换为键盘数。

示例:

exports.handler = function (event, context) { 

MyLambdaFuntion();
}

MyLambdaFuntion()
{
var bucketName = "TestBucket1";
var fileKey = "test.js";
s3.getObject(params, function (err, data) {
if (err)
    console.log(err, err.stack);
   else {
          console.log(data);
       }
 });
}

修改

以上不是必需的。虽然它有效,但它过于复杂。

可以通过USING子句指定alter语句中的类型:

在ALTER语句中使用此子句

-- setup a test table
BEGIN;
CREATE TABLE test (col VARCHAR[]);
INSERT INTO test (col) VALUES ('{"abc", "1"}'::varchar[]);
SELECT col FROM test;
-- returns {abc,1}
CREATE TYPE keycount AS (key VARCHAR, count INTEGER);
ALTER TABLE test ADD COLUMN col2 keycount;
UPDATE test SET col2 = (col[1], col[2]::int)::keycount;
ALTER TABLE test DROP COLUMN col;
ALTER TABLE test RENAME COLUMN col2 TO col;
SELECT col FROM test;
-- returns (abc,1)
COMMIT;

无需分期数据&掉落&重命名。