簡體   English   中英

如何在postgres jsonb中使用BETWEEN?

[英]How to use BETWEEN in postgres jsonb?

我有一些jsonb數據,例如:

{  
   "id":"58fd893414a570155ddf5120",
   "TPDId":"10101",
   "Services":[  
      "10093"
   ],
   "DaysInstances":[  
      17304,
      17300,
      17301,
      17302,
      17303
   ],
   "TPDProperties":{  
      "DisplayLabel":"TP display label W0ichP6h",
      "TimePeriodType":"Maintenance"
   }
}

DaysInstances字段是一個數組。

現在,我要選擇DaysInstances的值在17300和17303之間的記錄。

我試過這種SQL,但沒有用:

SELECT body FROM "TimePeriodInstance_100000001" where (body -> 'DaysInstances') between '17300' AND '17303';

此sql已工作,但現在很難在我們的系統中進行拼接:

SELECT DISTINCT body FROM "TimePeriodInstance_100000001" cross join 
json_array_elements((body -> 'DaysInstances')::json) where value::text::int between '17300' AND '17303';

還有其他想法嗎? 謝謝〜

嘗試:

(有效,如果jsons id字段對於每一行都是唯一的)

select test1.* from test1 inner join (
    select json_id from (
        select col->>'id' as json_id, jsonb_array_elements_text(col->'DaysInstances') as arrel from test1
    )t where arrel::numeric between 17300 and 17303
    GROUP BY json_id
) t2
on test1.col->>'id' = t2.json_id

如果您具有唯一的標識列(例如id ),則最好使用以下方法:

select test1.* from test1 inner join (
    select id from (
        select id, jsonb_array_elements_text(col->'DaysInstances') as arrel from test1
    )t where arrel::numeric between 17300 and 17303
    GROUP BY id
) t2
on test1.id = t2.id

您可以使用簡單的舊的相關子查詢(使用EXISTS ),而無需執行Aggregation& LATERAL來做到這一點:

SELECT body
FROM   "TimePeriodInstance_100000001"
WHERE  EXISTS(SELECT 1
              FROM   jsonb_array_elements(body -> 'DaysInstances') e
              WHERE  e BETWEEN '17300' AND '17303')

注意BETWEEN約束實際上是(隱式地)鍵入jsonb ,它具有比較運算符來備份它。 如果要綁定int s f.ex.,則需要強制轉換以使其起作用(或使用諸如BETWEEN to_jsonb($1) AND to_jsonb($2) )。

http://rextester.com/GAA60634

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM