使用CASE表达式转换still_available列为布尔类型时遇匹配异常
问题解决:将字符串类型的still_available列转换为布尔类型
背景
数据库表public.dim_products中有一列still_available,存储字符串值,仅包含'Removed'和'Still_available'两种取值。需要将该列转换为布尔类型,规则为:
'Removed'对应False'Still_available'对应True
初始尝试与问题
最初执行以下UPDATE语句尝试转换值:
dim_products_set_still_available_to_bool = f""" UPDATE public.dim_products SET still_available = CASE WHEN still_available = 'Removed' THEN {False} ELSE {True} END; """
执行后发现部分行被错误设置为True,不符合预期,导致无法将列数据类型顺利转换为布尔类型。
错误原因与修正方案
经排查,数据库中实际存储的可用状态字符串拼写为'Still_avaliable'(注意是avaliable,而非预期的available)。初始语句的ELSE分支会将所有非'Removed'的值统一设为True,但由于字符串不匹配,实际转换后的数据存在异常,无法满足布尔类型转换的要求。
修正后的语句明确匹配数据库中的实际字符串值:
dim_products_set_still_available_to_bool = f""" UPDATE public.dim_products SET still_available = CASE WHEN still_available = 'Removed' THEN {False} WHEN still_available = 'Still_avaliable' THEN {True} END; """
执行修正后的语句后,数据转换符合预期,后续可顺利将列类型改为布尔类型。
内容的提问来源于stack exchange,提问作者Swinging Treebranch
相关产品推荐
相关产品推荐

