2016-08-17 9 views
6

वर्तमान में मैं postgreSQL 9.5 के साथ काम कर रहा हूं और jsonb फ़ील्ड की सरणी के अंदर एक मान को अद्यतन करने का प्रयास कर रहा हूं। लेकिन मैं चयनित मान के सूचकांक प्राप्त करने में असमर्थ हूँpostgresql 9.5 jsonb_set json array

मेरे तालिका बस लगता है कि: सही मान काम करता है पाने के लिए

{"result": [ 
    {"8410": "ABNDAT", "8411": "Abnahmedatum"}, 
    {"8410": "ABNZIT", "8411": "Abnahmezeit"}, 
    {"8410": "FERR_R", "8411": "Ferritin"} 
]} 

मेरे SELECT कथन:

CREATE TABLE samples (
    id serial, 
    sample jsonb 
); 

मेरे JSON की तरह दिखता है :

SELECT 
    id, value 
FROM 
    samples s, jsonb_array_elements(s.sample#>'{result}') r 
WHERE 
    s.id = 26 and r->>'8410' = 'FERR_R'; 

परिणामों में:

+०१२३५१६४१०
id | value 
---------------------------------------------- 
26 | {"8410": "FERR_R", "8411": "Ferritin"} 

ठीक है, यह वही है जो मैं चाहता था। अब मैं एक नए तत्व "ratingtext" जोड़ने के लिए निम्नलिखित अद्यतन कथन का उपयोग एक अद्यतन निष्पादित करने के लिए (यदि पहले से ही वहाँ नहीं) हैं:

UPDATE 
    samples s 
SET 
    sample = jsonb_set(sample, 
       '{result,2,ratingtext}', 
       '"Some individual text"'::jsonb, 
       true) 
WHERE 
     s.id = 26; 

के बाद अद्यतन बयान निष्पादित, अपने डेटा इस (यह भी सही) की तरह दिखता है:

{"result": [ 
    {"8410": "ABNDAT", "8411": "Abnahmedatum"}, 
    {"8410": "ABNZIT", "8411": "Abnahmezeit"}, 
    {"8410": "FERR_R", "8411": "Ferritin", "ratingtext": "Some individual text"} 
]} 

अब तक तो अच्छा है, लेकिन मैं मैन्युअल 2 के सूचकांक मूल्य की खोज JSON सारणी के अंदर सही तत्व प्राप्त करने के लिए। अगर आदेश बदल दिया जाएगा, यह काम नहीं करेगा।

तो मेरी समस्या:

वहाँ एक रास्ता चयनित JSON सारणी तत्व के सूचकांक मिलता है और SELECT कथन और एक में अद्यतन बयान गठबंधन करने के लिए है?

बस की तरह है:

UPDATE 
    samples s 
SET 
    sample = jsonb_set(sample, 
       '{result,' || INDEX OF ELEMENT || ',ratingtext}', 
       '"Some individual text"'::jsonb, 
       true) 
WHERE 
     s.id = 26; 

samples.id और "8410" के मूल्यों बयान तैयार करने से पहले जाना जाता है।

या इस समय यह संभव नहीं है?

उत्तर

7

आप jsonb_array_elements() with ordinality का उपयोग कर एक की खोज तत्व का एक सूचकांक पा सकते हैं (ध्यान दें, 1 से ordinality शुरू होता है, जबकि json सरणी के पहले सूचकांक 0):

select 
    pos- 1 as elem_index 
from 
    samples, 
    jsonb_array_elements(sample->'result') with ordinality arr(elem, pos) 
where 
    id = 26 and 
    elem->>'8410' = 'FERR_R'; 

elem_index 
------------ 
      2 
(1 row) 

के आधार पर तत्व अद्यतन करने के लिए ऊपर क्वेरी का उपयोग करें अपने सूचकांक (ध्यान दें कि jsonb_set() का दूसरा तर्क एक पाठ सारणी है):

update 
    samples 
set 
    sample = 
     jsonb_set(
      sample, 
      array['result', elem_index::text, 'ratingtext'], 
      '"some individual text"'::jsonb, 
      true) 
from (
    select 
     pos- 1 as elem_index 
    from 
     samples, 
     jsonb_array_elements(sample->'result') with ordinality arr(elem, pos) 
    where 
     id = 26 and 
     elem->>'8410' = 'FERR_R' 
    ) sub 
where 
    id = 26;  

परिणाम:

select id, jsonb_pretty(sample) 
from samples; 

id |     jsonb_pretty     
----+-------------------------------------------------- 
26 | {            + 
    |  "result": [         + 
    |   {          + 
    |    "8410": "ABNDAT",     + 
    |    "8411": "Abnahmedatum"    + 
    |   },          + 
    |   {          + 
    |    "8410": "ABNZIT",     + 
    |    "8411": "Abnahmezeit"    + 
    |   },          + 
    |   {          + 
    |    "8410": "FERR_R",     + 
    |    "8411": "Ferritin",     + 
    |    "ratingtext": "Some individual text"+ 
    |   }          + 
    |  ]           + 
    | } 
(1 row) 
+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! यह एक आकर्षक की तरह काम करता है! मुझे एहसास नहीं हुआ कि मैं WHERE खंड में ** elem ** का उपयोग कर सकता हूं। –

+0

धन्यवाद klin, यह सिर्फ मेरे दिन बचाया! –