我有这样的桌子
id| booking_id | status | message | created_at
----------------------------------------------------------------------------------------------------------
1 | 1467 | VALIDATE | Validate Payment | 2022-03-18 07:43:20.688+00
2 | 1901 | SUCCESS | | 2022-03-18 07:51:58.072+00
3 | 1847 | FAILED | payment is insufficient | 2022-03-18 08:16:05.79+00
我创建这样的get函数
CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
RETURNS JSONB
LANGUAGE SQL
SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
FROM (SELECT * FROM booking.booking_status WHERE booking.booking_status.booking_id = booking_id) AS result
$$;
我试图这样调用函数
SELECT get_booking_status(1467)
但返回 json 全部 3 行而不是 1 行booking_id
1467
你能解释根本原因吗?
问题的根本原因是将参数 () 命名为与表booking_id
中的列名 ( booking_id
) 相同。处理查询时,任何不合格的引用都遵循层次结构来确定正确的引用;第一个是表格列。在这种情况下,对booking_idwhere booking.booking_status.booking_id = booking_id
的两个引用都被中断,因为引用了 table 列。那么对于表中的每一行来说都是如此。您基本上有 2 个选择:更改参数名称或使用函数名称限定。
CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
RETURNS JSONB
LANGUAGE SQL
SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
FROM (SELECT *
FROM booking.booking_status
WHERE booking.booking_status.booking_id
= get_booking_status.booking_id) AS result
$$;
另请参阅上面@a_horse_with_no_name 和@AdrianKlaver 的评论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句