Hasura PostgreSQL计算字段报错:operator does not exist: bigint = text
问题原因
你遇到的报错和逻辑偏差主要来自两处:
- 语法优先级错误:你编写的
WHERE id=t.room_id ||' minutes'会被PostgreSQL优先执行||字符串拼接操作,等价于WHERE id = (t.room_id || ' minutes'),rooms表的id为bigint类型,拼接后的结果是文本类型,二者类型不匹配直接触发bigint = text运算符不存在的报错 - 逻辑不符合需求:你写的
SELECT count(*)是统计符合条件的房间行数,而非取出对应房间的game_length字段值,和要实现的功能不匹配
修正后的SQL函数
CREATE OR REPLACE FUNCTION public.calculate_reservation_total_time(t test) RETURNS timestamp with time zone LANGUAGE sql STABLE AS $function$ SELECT t.start_time + (SELECT game_length FROM rooms WHERE id = t.room_id) * '1 minute'::interval; $function$;
补充说明
如果需要兼容房间不存在的异常场景,可以给子查询添加默认值处理,避免返回空值:
CREATE OR REPLACE FUNCTION public.calculate_reservation_total_time(t test) RETURNS timestamp with time zone LANGUAGE sql STABLE AS $function$ SELECT t.start_time + COALESCE((SELECT game_length FROM rooms WHERE id = t.room_id), 0) * '1 minute'::interval; $function$;
内容的提问来源于stack exchange,提问作者Logan Rios
相关产品推荐
相关产品推荐

