Postgresql
從 JSON 數組的切片中獲取最大值?
我想在
[1,2,3,5,6,7,9,10]
包含在名為Data
table的欄位中的 Json 對象(典型)的切片中獲取最大值raw
。切片的限制
Start
&包含在另一個名為的 Json 對像中,該對象包含在名為的表中End``Features``features
這是輸入:
CREATE TABLE raw ( id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY data json ); INSERT INTO raw (data) VALUES ('[1,2,3,5,6,7,9,10]'); CREATE TABLE features ( id int, features json ); INSERT INTO features (id, features) VALUES (1, '{"Start" : 1, "End": 5}');
我想要的輸出是
7
,即切片的最大值$$ 2,3,5,6,7 $$ 這是我在看其他文章時想到的,但它不起作用……
SELECT R."ID", F."Features"->>'Start' AS Start, F."Features"->>'End' AS End, sort_desc((array(select json_array_elements(R."Data")))[F."Features"->>'Start':F."Features"->>'End'])[1] as maxData FROM raw AS R INNER JOIN features AS F ON R."ID" = F."ID"
我得到的大概錯誤資訊是關於
sort_desc
:沒有與此名稱或此類參數對應的函式。您應該轉換數據的類型
您可以取消嵌套 json 數組:
具有 ORDINALITY 的Postgres :
當 FROM 子句中的函式以 WITH ORDINALITY 為後綴時,將在輸出中附加一個 bigint 列,該列從 1 開始,並為函式輸出的每一行增加 1。這在諸如 unnest() 之類的集合返回函式的情況下最有用。
看看Erwin Brandstetter的這個答案:
SELECT r."ID", MAX(t.elem::int) MaxElem FROM raw r JOIN features f ON f."ID" = r."ID" JOIN LATERAL json_array_elements_text(r."Data") WITH ORDINALITY AS t(elem, n) ON TRUE WHERE n >= (f."Features"->>'Start')::int + 1 AND n <= (f."Features"->>'End')::int + 1 GROUP BY r."ID";
身份證 | 麥克萊姆 -: | ------: 1 | 7
db<>在這裡擺弄
或者,如果您更喜歡使用 intarray 模組:
SELECT r."ID", (sort_desc(((ARRAY(SELECT json_array_elements_text(r."Data")))::int[])[(f."Features"->>'Start')::int + 1:(f."Features"->>'End')::int + 1]))[1] FROM raw r JOIN features f ON f."ID" = r."ID";