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