PostgreSQL函数创建求助:将整数型(1,0)列转换为'Yes'/'No'并重新展示表
解决PostgreSQL中整数列转Yes/No并返回整张表的问题
嘿,我来帮你梳理一下问题出在哪,以及怎么解决~
首先,你的函数有两个关键问题导致它无法正常工作:
- 返回结构与查询结果不匹配:你定义的函数要返回包含
customer_id、first_name等多列的表,但你的SELECT语句只返回了转换后的active列,这就造成了结构不一致,调用时自然会出错。 - 使用了中文单引号:PostgreSQL只识别英文单引号
',你写的‘Yes’和‘No’是中文引号,这属于语法错误。
下面给你几种可行的实现方案,你可以根据需求选择:
方案1:直接用SELECT查询(无需函数)
如果只是一次性或者频繁查询转换后的结果,直接写SELECT语句最简洁:
SELECT customer_id, first_name, last_name, email, rental_date, CASE WHEN active = 1 THEN 'Yes' ELSE 'No' END AS active FROM email_marketing_list;
这条语句会直接返回包含转换后active列的整张表数据。
方案2:修正后的PL/pgSQL函数
如果你确实需要用函数来封装这个逻辑,修正后的函数应该确保返回列和查询列完全对应:
CREATE OR REPLACE FUNCTION convert_active() RETURNS TABLE ( customer_id int, first_name varchar, last_name varchar, email varchar, rental_date timestamp, active varchar ) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT eml.customer_id, eml.first_name, eml.last_name, eml.email, eml.rental_date, CASE WHEN eml.active = 1 THEN 'Yes' ELSE 'No' END AS active FROM email_marketing_list eml; END; $$;
调用的时候要注意,因为函数返回的是表类型,需要用SELECT * FROM来调用:
SELECT * FROM convert_active();
方案3:创建视图(更推荐的长期方案)
如果这个转换后的结果是你经常需要查询的,创建视图会比函数更合适——视图就像一张虚拟表,查询起来更直观,维护也更简单:
CREATE VIEW email_marketing_list_active_text AS SELECT customer_id, first_name, last_name, email, rental_date, CASE WHEN active = 1 THEN 'Yes' ELSE 'No' END AS active FROM email_marketing_list;
之后每次需要查询时,直接像查普通表一样操作视图即可:
SELECT * FROM email_marketing_list_active_text;
另外你提到用CASE表达式没成功,大概率也是因为没包含所有需要的列,或者不小心用了中文引号,检查一下这两个点应该就能解决啦~
内容的提问来源于stack exchange,提问作者Michele Ann Riedel
相关产品推荐
相关产品推荐

