在postgresql中使用alter column更改列的数据类型时出错

问题描述 投票:0回答:1

我有一个表,其中的列如下:

system_name varchar(255),
from_package_name varchar(255),
from_version varchar(255)

from_version 列现在属于 variatingcharacters 类型,其中包含某个包的 version版本应该与此语义版本控制Spec兼容,但通常情况并非如此。

因此,当我尝试使用以下查询将此列的数据类型从 varchar 更改为 semver(Semver 是 Postgres 扩展,它是语义版本控制的数据类型)时:

ALTER TABLE relations
ALTER COLUMN from_version TYPE SEMVER
USING CAST((COALESCE(from_version,NULL)) AS SEMVER);

我收到以下错误:

ERROR:  bad semver value '2.16.0-27020175.00aeff62': semver prerelease numbers can't start with 0 

SQL state: XX000

这是可以理解的,因为并非列中的所有值都与 Semver 兼容,我想用“NULL”替换无法转换为 Semver 类型的值(这就是尝试使用 COALESCE stmt 的原因)。

如何跳过错误并更改列中所有值的数据类型?

postgresql semantic-versioning
1个回答
1
投票

幸运的是 semver 提供了一个适合此目的的函数,is_semvar。

alter table relations alter column from_version type semver using 
   case when is_semver(from_version) then semver(from_version) end

但我认为你会想要记录和调查,而不是只是默默地丢弃破损的。

© www.soinside.com 2019 - 2024. All rights reserved.