gpt4 book ai didi

postgresql - 在 PostgreSQL 中使用查询设置列类型

转载 作者:行者123 更新时间:2023-11-29 12:39:10 31 4
gpt4 key购买 nike

优后answer通过 Alexandre GUIDET,我尝试运行以下查询:

 create table egg (id (SELECT 
pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = (
SELECT c.oid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(TABLENAME)$'
AND pg_catalog.pg_table_is_visible(c.oid)
)
and a.attname = 'COLUMNNAME'));

然而,PostgreSQL 提示语法不正确。具体来说,它说我不能写:create table egg (id (SELECT.
有什么解决方法吗?我不能将查询结果转换为文本并将其重新用作查询吗?

最佳答案

有一种更简单的方法可以做到这一点。

SELECT pg_typeof(col)::text FROM tbl LIMIT 1

唯一的前提是模板表至少有一行。查看manual on pg_typeof()

正如 Milen 所写,您需要像这样EXECUTE 动态 DDL 语句。
一个更简单的 DO 语句:

DO $$BEGIN
EXECUTE 'CREATE TABLE egg (id '
|| (SELECT pg_typeof(col)::text FROM tbl LIMIT 1) || ')';
END$$;

或者,如果您不确定模板表中有任何行:

DO $$BEGIN
EXECUTE (
SELECT format('CREATE TABLE egg (id %s)'
, format_type(atttypid, atttypmod))
FROM pg_catalog.pg_attribute
WHERE attrelid = 'tbl'::regclass -- name of template table
AND attname = 'col' -- name of template column
AND attnum > 0 AND NOT attisdropped
);
END$$;

这些条件似乎是多余的,因为您要查找特定的列 any

format()需要 Postgres 9.1+。

相关:

关于postgresql - 在 PostgreSQL 中使用查询设置列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4336465/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com