postgresql 我需要在postgres中创建一个视图,它提取JSON列的元素

eaf3rand  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(126)

这是我在postgresql中的视图,带有json列(labtestgroup和price)

CREATE OR REPLACE VIEW public.orders_with_prices
AS SELECT o.id,
    replace(''::text || o.labtestgroup, '"'::text, ''::text) AS labtestgroup,
    o.price,
   FROM ( SELECT orders.id,
            json_array_elements(orders."labTestGroups") AS labtestgroup,
            json_array_elements(orders.prices) AS price,
           FROM orders) o;

字符串
labtestgroups和prices是类似这样的json数组[“12”,“213”]
在我的表中,记录是分开的,但我有一个空数组[ ]的记录,这些记录不会出现在我的表中。
实际视图=
| ID|实验组|价格|
| --|--|--|
| 1 | 234 | 23 |
| 1 | 245 | 25 |
| 4 | 525 | 12 |
我需要显示空记录,值可以是[]、0或null
| ID| Labtestgroup|价格|
| --|--|--|
| 1 | 234 | 23 |
| 1 | 245 | 25 |
| 2 |[客户端]|[客户端]|
| 3 |[客户端]|[客户端]|
| 4 | 525 | 12 |

wr98u20j

wr98u20j1#

如果输入JSON数组为空或JSON字段为NULL,Postgres中的json_array_elements函数将不会生成行,这就是为什么您只能看到带有json数据的订单。为了避免这种情况,请使用左侧连接到json_array_elements的输出

CREATE OR REPLACE VIEW PUBLIC.orders_with_prices AS

SELECT
      o.id
    , COALESCE(replace(''::TEXT || l.labtestgroup, '"'::TEXT, ''::TEXT), '[]') AS labtestgroup
    , COALESCE(p.price, '[]') AS price
FROM orders o
LEFT JOIN LATERAL json_array_elements(o."labTestGroups") l(labtestgroup) ON TRUE
LEFT JOIN LATERAL json_array_elements(o.prices) p(price) ON TRUE;

字符串
然后,如果json数据为null,则使用coalesce输出[]。输出0或NULL可能更容易,因为这样列会更一致(并且您可能希望将其中一个或两个转换为数字)。

相关问题