为什么 Postgresql 函数不能按预期工作
Why does Postgresql function not work as expected
我有table这样的
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)
但是 return json 所有 3 行而不是 1 行 booking_id
1467
你能解释一下根本原因吗?
问题的根本原因是将参数 (booking_id
) 命名为与 table 中的列名 (booking_id
) 相同。在处理查询时,任何不合格的引用都遵循一个层次结构来确定正确的引用;第一个是 table 列。在这种情况下,where booking.booking_status.booking_id = booking_id
对 booking_id 的两个引用都被解释为引用 table 列。 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 的评论。
我有table这样的
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)
但是 return json 所有 3 行而不是 1 行 booking_id
1467
你能解释一下根本原因吗?
问题的根本原因是将参数 (booking_id
) 命名为与 table 中的列名 (booking_id
) 相同。在处理查询时,任何不合格的引用都遵循一个层次结构来确定正确的引用;第一个是 table 列。在这种情况下,where booking.booking_status.booking_id = booking_id
对 booking_id 的两个引用都被解释为引用 table 列。 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 的评论。