为什么 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_idbooking_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 的评论。