如何将列更改为长度为L的VARCHAR类型,其中L基于列聚合,如MAX(LENGTH(column)),PostgreSQL DB?

wwtsj6pe  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(132)

我尝试将名为names的列类型从text更改为长度为L的VARCHAR。其中L是names的最大长度。我尝试使用内部/子查询,如下所示:
这甚至是可能的吗?有任何替代方案可以在一个查询中做到这一点吗?

ALTER TABLE friends
ALTER COLUMN names TYPE VARCHAR(
    SELECT MAX(LENGTH(names))
    FROM friends
)

字符串
我在PgAdmin 4 SQL控制台中得到以下错误:

ERROR:  syntax error at or near "SELECT"
LINE 3:  SELECT MAX(LENGTH(card_number))

0tdrvxhp

0tdrvxhp1#

你可以在Postgres上使用VARCHAR(MAX)的等价物,这可以通过简单地使用VARCHAR来实现,没有大小:

ALTER TABLE friends ALTER COLUMN names TYPE VARCHAR;

字符串
请注意,对于VARCHAR,任何给定的字符串都只会使用该字符串的存储空间,没有填充(不像CHAR)。
或者,我们可以使用TEXT类型:

ALTER TABLE friends ALTER COLUMN names TYPE TEXT;

5cnsuln7

5cnsuln72#

你可能会更好地使用text。提出这个问题:在这种情况下,你只能使用整数常量,所以要实现“在一个查询”中,你需要动态SQL。

create table a(b varchar(60));
insert into a values ('123456789'),('12345');

select data_type,character_maximum_length 
from information_schema.columns 
where table_name='a' and table_schema='public' and column_name='b';

字符串
| 数据类型|字符最大长度|
| --|--|
| character varying| 60 |

do $f$
declare new_len_limit int;
begin
select max(length(b)) from a into new_len_limit;
execute format('alter table a alter column b type varchar(%s)',new_len_limit);
end $f$ language plpgsql;

select data_type,character_maximum_length 
from information_schema.columns 
where table_name='a' and table_schema='public' and column_name='b';


| 数据类型|字符最大长度|
| --|--|
| character varying| 9 |

alter table a alter column b type varchar(select 5);
ERROR:  syntax error at or near "select"
LINE 1: alter table a alter column b type varchar(select 5);
                                                  ^
create function max_b_len() returns int language sql as 'select 5';
alter table a alter column b type varchar(max_b_len());
ERROR:  syntax error at or near "max_b_len"
LINE 1: alter table a alter column b type varchar(max_b_len());
                                                  ^

fiddle

相关问题