PostgreSQL中用CASE语句创建weight_class列遇问题求助
解决PostgreSQL中创建weight_class列并赋值的问题
你的问题核心是:当前的SELECT语句仅返回包含计算后weight_class的查询结果,并没有修改实际的表结构,所以public.dim_products表不会真正新增这个列。要在表中永久创建该列并赋值,有两种常用方法:
方法一:先添加列,再批量赋值
1. 新增weight_class列
先执行ALTER TABLE语句在表中创建列:
ALTER TABLE public.dim_products ADD COLUMN weight_class VARCHAR(20);
指定VARCHAR(20)是因为你的分类名称最长为Truck_Required,该长度足够覆盖所有情况。
2. 用UPDATE语句批量赋值
结合你给出的重量范围修正CASE逻辑(处理边界值,对齐需求),执行更新:
UPDATE public.dim_products SET weight_class = CASE WHEN weight_kg::float < 2 THEN 'Light' WHEN weight_kg::float >= 3 AND weight_kg::float <= 40 THEN 'Mid_Sized' WHEN weight_kg::float >= 41 AND weight_kg::float <= 140 THEN 'Heavy' WHEN weight_kg::float > 140 THEN 'Truck_Required' -- 若2kg有归类需求,可补充对应分支,否则留为NULL ELSE NULL END;
注意:你需求中Mid_Sized范围是3-40,因此要把条件从>=2调整为>=3,避免2kg被错误归类;ELSE NULL用于处理不符合任何范围的数值(比如NULL值或异常值)。
方法二:使用生成列(自动维护,推荐PostgreSQL 12+)
如果使用PostgreSQL 12及以上版本,可以创建生成列,这样weight_class会自动跟随weight_kg的变化更新,无需手动执行UPDATE:
ALTER TABLE public.dim_products ADD COLUMN weight_class VARCHAR(20) GENERATED ALWAYS AS ( CASE WHEN weight_kg::float < 2 THEN 'Light' WHEN weight_kg::float >= 3 AND weight_kg::float <= 40 THEN 'Mid_Sized' WHEN weight_kg::float >= 41 AND weight_kg::float <= 140 THEN 'Heavy' WHEN weight_kg::float > 140 THEN 'Truck_Required' ELSE NULL END ) STORED;
STORED表示列值会被存储在表中,查询时直接读取,性能更优;PostgreSQL目前仅支持STORED类型的生成列。
补充说明
- 你最初的
SELECT语句语法错误,原因是CASE位置不正确,且字符串值未加单引号(比如Light需写成'Light'),修正后的SELECT可先用来验证逻辑是否正确,再执行表结构修改操作。 - 若
weight_kg本身就是数值类型(如FLOAT、NUMERIC),可去掉::float类型转换,简化语句。
内容的提问来源于stack exchange,提问作者Swinging Treebranch
相关产品推荐
相关产品推荐

