SQL 连接查询(连接字段作为 json 对象)
SQL join query (joined field as a json object)
我正在使用 PostgreSQL,我正在使用 Nodejs 和 PG 包。我有这些表:
request_tbl:
req_id | customer_id | details
----+--------------------------------------
1 | 1 | something
customers_tbl:
cust_id | full_name | age
----+--------------------------------------
1 | tarik hh | 23
我需要一个查询,在将其转换为 json 后提供此输出。
这是左联接,但我需要将联接的列作为对象。
[
{
"req_id":"1" ,
"details":"something" ,
"customer":{
"cust_id":"1",
"full_name":"tarik hh"
}
}
]
使用 postgresql 的内置 json_build_object
函数并创建您自己的函数,如下所示:
CREATE FUNCTION get_req_w_cust(
req_id_in int,
out results json
) AS $$
BEGIN
SELECT json_build_object(
'req_id', request_tbl.req_id,
'details', request_tbl.details,
'customer', json_build_object(
'cust_id', customers_tbl.cust_id,
'full_name', customers_tbl.full_name
)
) INTO results
FROM request_tbl, customers_tbl
WHERE request_tbl.customer_id = customers_tbl.cust_id
AND request_tbl.req_id = req_id_in
END
$$ language plpgsql;
然后您可以使用
从您的代码访问它
let {rows: [{results}] = await pg.query('select get_req_w_cust() AS results',[id]);
或者只使用查询而不将其包装在函数中。
我正在使用 PostgreSQL,我正在使用 Nodejs 和 PG 包。我有这些表:
request_tbl:
req_id | customer_id | details
----+--------------------------------------
1 | 1 | something
customers_tbl:
cust_id | full_name | age
----+--------------------------------------
1 | tarik hh | 23
我需要一个查询,在将其转换为 json 后提供此输出。
这是左联接,但我需要将联接的列作为对象。
[
{
"req_id":"1" ,
"details":"something" ,
"customer":{
"cust_id":"1",
"full_name":"tarik hh"
}
}
]
使用 postgresql 的内置 json_build_object
函数并创建您自己的函数,如下所示:
CREATE FUNCTION get_req_w_cust(
req_id_in int,
out results json
) AS $$
BEGIN
SELECT json_build_object(
'req_id', request_tbl.req_id,
'details', request_tbl.details,
'customer', json_build_object(
'cust_id', customers_tbl.cust_id,
'full_name', customers_tbl.full_name
)
) INTO results
FROM request_tbl, customers_tbl
WHERE request_tbl.customer_id = customers_tbl.cust_id
AND request_tbl.req_id = req_id_in
END
$$ language plpgsql;
然后您可以使用
从您的代码访问它let {rows: [{results}] = await pg.query('select get_req_w_cust() AS results',[id]);
或者只使用查询而不将其包装在函数中。