PostgreSQL视图创建:CASE WHEN赋值列值报类型不匹配错误如何解决
问题原因
你触发报错的核心原因是CASE表达式中误用了判断逻辑作为返回值:
你在THEN分支写的test.category = test.metric_type是布尔判断语句,返回结果为true/false的布尔类型,而ELSE分支返回的是text类型的字段值,两种类型不匹配,因此数据库抛出类型无法对齐的错误。
另外你的原始代码还存在两个不符合需求的问题:
- 子查询添加了
WHERE lin.metric_type LIKE 'SIZE_%'过滤条件,会直接丢弃所有非SIZE_开头的原始数据,如果你需要保留全量数据需要删除该条件 - SELECT列表重复返回了metric_type字段,和你要求的输出结构不符
修复后的代码
以下是符合需求的视图代码,可直接使用:
CREATE OR REPLACE VIEW <替换为你的视图名称> AS SELECT lin.metric_name, -- 处理metric_type:SIZE_开头则替换为company_size,否则保留原值 CASE WHEN lin.metric_type LIKE 'SIZE_%' THEN 'company_size' ELSE lin.metric_type END AS metric_type, lin.metric_value, -- 处理category:SIZE_开头则取原metric_type值,否则赋值为Undefined CASE WHEN lin.metric_type LIKE 'SIZE_%' THEN lin.metric_type ELSE 'Undefined'::text END AS category FROM "LIN_Main_Followers" lin;
如果你确实只需要保留SIZE_前缀的行,可以在FROM语句后追加过滤条件:
WHERE lin.metric_type LIKE 'SIZE_%'
添加该过滤条件后,CASE分支可以直接简化为固定值,不需要再做判断。
验证效果
执行上述代码后,原metric_type = 'SIZE_10001_OR_MORE'的行输出结果和你要求的理想输出完全一致:
| metric_name | metric_type | metric_value | category |
|---|---|---|---|
| likes | company_size | 2 | SIZE_10001_OR_MORE |
| likes | company_size | 10 | SIZE_11_TO_50 |
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

