我目前正在嘗試使用具有兩列的 PostgreSQL 創建新的資料行(ID, identity_data)。雖然,原始的 identity_data 是一個 jsonb 物件,有很多不必要的屬性,我只想包括(full_name, avatar_url, provider_id, email_verified)提供的大約 10 條路徑中的4條。
目前,如果你看下面的SQL陳述句,我洗掉了我不想直接傳遞的路徑。這樣做的問題是,如果有任何新路徑,除非我手動指定要洗掉它們,否則它們不會被洗掉。
BEGIN -- Insert/Update clone of identity_data to public.identities table:
INSERT INTO public.identities (id, identity_data)
VALUES (new.id, new.identity_data::JSONB #- '{email}' #- '{iss}' #- '{sub}') ON CONFLICT (id) DO
UPDATE
SET id = excluded.id,
identity_data = excluded.identity_data::JSONB #- '{email}' #- '{iss}' #- '{sub}';
RETURN NEW;
END;
因此,我的問題是是否有一種方法可以顯式選擇我想要傳遞給新 identity_data 列的鍵路徑,而不是洗掉我目前知道的鍵路徑。
uj5u.com熱心網友回復:
沒有像 那樣簡單方便的運算子#-,但是你可以寫
INSERT INTO public.identities (id, identity_data)
VALUES (NEW.id, jsonb_build_object(
'full_name', NEW.identity_data->'full_name',
'avatar_url', NEW.identity_data->'avatar_url',
'provider_id', NEW.identity_data->'provider_id',
'email_verified', NEW.identity_data->'email_verified'
))
ON CONFLICT (id) DO UPDATE
SET id = excluded.id,
identity_data = excluded.identity_data;
或者
INSERT INTO public.identities (id, identity_data)
VALUES (NEW.id, to_jsonb(
SELECT *
FROM jsonb_to_record(NEW.identity_data) AS id(full_name text, avatar_url text, provider_id int, email_verified boolean)
))
ON CONFLICT (id) DO UPDATE
SET id = excluded.id,
identity_data = excluded.identity_data;
(如果您不想斷言單個元素的型別,則jsonb始終有效)
或(最清楚地表達意圖)
INSERT INTO public.identities (id, identity_data)
VALUES (NEW.id, (
SELECT jsonb_object_agg(key, value)
FROM jsonb_each(NEW.identity_data)
WHERE key IN ('full_name', 'avatar_url', 'provider_id', 'email_verified')
))
ON CONFLICT (id) DO UPDATE
SET id = excluded.id,
identity_data = excluded.identity_data;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/395786.html
標籤:PostgreSQL的
