2017-02-01 9 views
0

にバックスラッシュを削除する(のが「情報」と呼んでみましょう)がどのように私はバックスラッシュを削除するにはPostgresのを使用して、このPostgresは私がjsonbフィールドを持っているjsonbフィールド

{"a": "foo", "c": "{ \"d\": \"dog\"}", \"b\": \"bark\"} 

のような値を持っていますか? 私はそれらのいずれかの作品

REPLACE(info::text, '\', '') 

またはこの REGEXP_REPLACE(情報::テキスト、 '\'、 '')

を使用してみました。

誰かが助けてくださいでした。.. jsonbをloweriseする

+0

これはjson/jsonbですか?なぜあなたは\を削除する必要がありますか?文字列 "c": "{\" d \ ":\" dog \ "}"の引用符であるため、 " –

+0

\"が使用されています。 ?「} –

+0

これはい、特に、ここで がコードであるJSON操作の結果であった:。 $$ )( ARRAY_AGG(キー選択json_objectとして機能update_info(情報jsonb) 戻りjsonb言語SQLを作成したり、交換してください。 、 ARRAY_AGG( ケースキー「B」、下位(値) 他の値の末尾)):: jsonb_each_textからjsonb (情報) $$; – vichsu

答えて

1

問合せ:

WITH RECURSIVE z3 AS (
    WITH z2 AS (
      WITH RECURSIVE z AS (
       WITH x AS (
        -- just your variable 
        SELECT '{"a":"foo", "b":"BARK", "c" :{ "d": "dog"}}'::jsonb AS j 
       ) SELECT j, 
         ARRAY [ a ] AS a 
       FROM (
         SELECT j, 
           jsonb_object_keys(j) AS a 
          FROM x 
        ) AS a 
       UNION ALL SELECT j, 
         a || b 
        FROM (
         SELECT j, 
           a, 
           jsonb_object_keys(j#>(a)) AS b 
          FROM z 
         WHERE j#>>(a) ~ '^\{.*\}$' 
         ) AS A 
      ) SELECT *, 
        dense_rank() OVER (ORDER BY a) AS i 
       FROM z 
       WHERE NOT j#>>(a) ~ '^\{.*\}$' 
     ) SELECT i, 
       jsonb_set(j, a, to_jsonb(lower(j#>>(a)))) AS j 
      FROM (
        SELECT * FROM z2 ORDER BY i LIMIT 1 
       ) AS a 
     UNION ALL SELECT z2.i, 
       jsonb_set(z3.j, 
       z2.a, 
       to_jsonb(lower(z3.j#>>(z2.a)))) 
      FROM z3 
      JOIN z2 ON (z2.i = z3.i + 1) 
) SELECT j FROM z3 ORDER BY i DESC LIMIT 1; 

いくつかの説明: zのCTEはjsonbオブジェクト内のすべての文字列を検索します。 'a'はjson文字列へのパスです。出力:

     j      | a | dense_rank 
----------------------------------------------+-------+------------ 
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {a} |   1 
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {b} |   2 
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {c,d} |   3 
(3 rows) 

z3とdense_rankは1回につき1つ(再帰呼び出し)に適用され、lower to jsonに適用されます。