1

私は PostgreSQL で JSONB を使用したインデックス作成の例を行っており、以下のようにランダムな uuid を JSON の一部に追加したいと考えています。ただし、構文を正しく取得することはできません。最も近いのは です"{"lookup_id": " || uuid || "}"

But I require
{"lookup_id": "92b3b21a-a87c-1798-5d91-3dbf3043c209"}

私のコードは次のとおりです。

INSERT INTO test (id, json)
SELECT x.id, '{
    "lookup_id": " || uuid || "
   }'::jsonb 
FROM generate_series(1,100) AS x(id),
     uuid_in(md5(now()::text)::cstring) AS uuid;
4

1 に答える 1

1

関数を使用できrow_to_jsonます:

select x.id, row_to_json(r.*)::jsonb
from generate_series(1,100) AS x(id)
    cross join (select uuid_in(md5(now()::text)::cstring) as lookup_id) as r;

アップデート

まず、uuid一意の uid を作成できるように使用できます。

CREATE EXTENSION "uuid-ossp";

with cte as (
    select
        *, uuid_generate_v4() as uuid
    from generate_series(1,5) AS x(id)
)
select distinct uuid from cte

------------------------------------------------
"e980c784-8aae-493f-90fb-1091280fe4f7"
"45a80660-3be8-4538-a039-13d97d6306af"
"5380f285-5d6b-467a-a83a-7fdc5c0ebc4c"
"7a435b36-95d3-49fc-808f-359838a866ed"
"3164a544-a2c9-4cd0-b0c4-199a99986cea"

次に、これを既存の にマージしますjson。今のところ愚かで最も簡単な方法は、次のようなものです。

with cte as (
    select
        '{"a":1}'::json as j, uuid_generate_v4() as uuid
    from generate_series(1,5) AS x(id)
)
select 
    left(j::text, length(j::text) - 1) || ', "uuid":' || to_json(uuid) || '}'
from cte

ただし、json をマージする関数を記述したり、hstore拡張機能を使用して json をマージしたりすることもできます。

with cte as (
    select
        id, '{"a":1, "b":2}'::json as data, uuid_generate_v4() as uuid
    from generate_series(1,5) AS x(id)
), cte2 as (
    select 
        id,
        (
            select hstore(array_agg(r.key), array_agg(r.value))
            from (
                select *
                from json_each_text(c.data) as j
                union all
                select 'uuid', c.uuid::text
            ) as r
        ) as data
    from cte as c
)
select
    id, hstore_to_json(data)
from cte2

そして、PostgreSQL のより大きな専門家が、json を一緒にマージするためのよりエレガントな方法をアドバイスできると確信しています。

于 2015-03-05T11:29:50.467 に答える