我有一个表,其中的列如下:
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 的原因)。
如何跳过错误并更改列中所有值的数据类型?
幸运的是 semver 提供了一个适合此目的的函数,is_semvar。
alter table relations alter column from_version type semver using
case when is_semver(from_version) then semver(from_version) end
但我认为你会想要记录和调查,而不是只是默默地丢弃破损的。