2017-01-20 54 views
1

我有一個數據庫,其中包含大量引用非現場圖像的JSON blob。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:

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

這些圖像現在從http感動://到https://開頭,我想更新到數據。我最終會完全刪除域名,因此這些都是相對路徑,從而避免了這種大屠殺!

我想做得非常粗糙的,如:

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

您需要向我們展示'images'的JSON結構。 –

+0

類型'ARRAY'包含'JSONB' – uniquelau

+0

爲什麼JSONB _array_?爲什麼不使用一個簡單的JSONB列,它包含_contains_一組json元素?這是重複的去標準化 –

回答

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;