Postgresql

從 JSON 數組的切片中獲取最大值?

  • January 17, 2019

我想在[1,2,3,5,6,7,9,10]包含在名為Datatable的欄位中的 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"-&gt;&gt;'Start')::int + 1:(f."Features"-&gt;&gt;'End')::int + 1]))[1]
FROM
   raw r
JOIN
   features f
   ON f."ID" = r."ID";

這裡重新測試

引用自:https://dba.stackexchange.com/questions/227416