现在我有一个varchar数组(nullable& no default value), 并希望将其转换为pair(varchar,integer)数组。 对于整数值,现在只设置为0。
例如,["a", "b"]
将为[("a", 0), ("b", 0)]
。
我已经知道我可以通过以下方式创建配对类型:
CREATE TYPE keycount AS (key VARCHAR, count INTEGER);
但不知道如何使用SET
来修改列。
感谢您的任何建议!
答案 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;
无需分期数据&掉落&重命名。