2017-01-20 15 views
1

多くのオフサイトイメージを参照するJSONのたくさんのブロブを含むデータベースがあります。Postgres 9.6 - JSONB内に保存されたテキストを更新する

テーブル:

CREATE TABLE vendors (
    id uuid NOT NULL, 
    name character varying(255) NOT NULL, 
    images jsonb[], 
    location jsonb, 
    user_id uuid, 
    created timestamp with time zone, 
    updated timestamp with time zone 
); 

JSON://と私はデータに更新したいと思います:httpsに//:

{ 
    "url": "http://domain.com/eid/id/file.jpg", 
    "title": "foo", 
    "eid": "eid", 
    "id": "id" 
} 

これらのイメージは、今のhttpから移動してきました。私は最終的にドメインを完全に削除するので、これらは相対パスなので、この大虐殺を避けることができます!

私のような、非常に、粗何かを考えていた:私は次のエラー見ていますしかし

UPDATE vendors SET images = REPLACE(images, 'http://', 'https://'); 

LINE 1: UPDATE vendors SET images = REPLACE(images, 'http://','https... 
            ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

を、私はこの問題を推測しているが、タイプは一部のキャストであります私はそれを理解することはできません。

+1

「画像」のJSON構造を表示する必要があります。 –

+0

'ARRAY'に' JSONB'が含まれています – uniquelau

+0

なぜJSONB _array_ですか? json要素の配列を含む単純なJSONB列を使用しないでください。それは重複した正規化解除です –

答えて

1
WITH https AS (
    SELECT v.id, array_agg(x.i) newimages 
     FROM vendors v JOIN 
      LATERAL jsonb_array_elements(
         replace(to_jsonb(v.images)::text, 
           'http://', 
           'https://' 
        )::jsonb 
        ) x(i) 
       ON TRUE 
     GROUP BY v.id 
) 
UPDATE vendors v 
    SET images = https.newimages 
    FROM https 
    WHERE v.id = https.id; 
関連する問題