0

私が持っているものと私が知っているもの:

  • {"home":["1","2","5"], "work":["15","16","19"]}のようなjson配列
  • 新しい整数要素 (例: "11")
  • 新しい要素「自宅」または「職場」の場所 (「自宅」など)

必要なもの:

  • この要素を json 配列の末尾の適切な場所に追加します
  • 正規表現でやる
  • regexp_replace を使用して postgreSQL で実行する
  • 結果は次のようになります: {"home":["1","2","5","11"], "work":["15","16","19"]}

私が試したこと:

SELECT regexp_replace('{"home":["1","2","5"], "work":["15","16","19"]}', '(.*)("home":\[)(("[0-9]*",)*("[0-9]*")*)(\])(.*)', '\1\2\3,"11"\6\7', 'g');

わからないこと: - 場所が "home":[] で、"," なしで "11" を入力する必要がある場合はどうなりますか? どうやって?

4

2 に答える 2

1

私はpostgresqlの専門家ではありませんが、おそらく次のトリックを試すことができます:

SELECT regexp_replace('{"home":["1","2","5"], "work":["15","16","19"]}' || ',"11"', '("home":\[)(?:(].*)(.{4}$)|([^]]+)(.*)(.{5}$))|.{5}$', '\1\3\4\2\6\5', 'g');

アイデアは、元の文字列を,"11"before と連結することです。配列が空の場合、グループ 3 は のみをキャプチャしますが、"11"配列が空でない場合、グループ 6 は をキャプチャし,"11"ます。

.{5}$文字列の最後で一致,"11"し、すべてのキャプチャ グループが空であるため、置換文字列によって削除されます。

明らかに、量指定子は、追加する文字列の長さに合わせて調整する必要があります。したがって13240、パターンを追加する場合は次のようになります。

("home":\[)(?:(].*)(.{7}$)|([^]]+)(.*)(.{8}$))|.{8}$

ここで例を見ることができます。

注: 明示的な量指定子なしで同じことができます:

("home":\[)(?:(].*)("[^"]*"$)|([^]]+)(.*)(,"[^"]*"$))|,"[^"]*"$
于 2015-02-13T23:18:01.800 に答える
1

JSON の処理に正規表現を使用しないでください。それはただの悪い考えです。HTML と同様に、JSON は通常の言語ではありません。JSON は処理のために解析する必要があります。

私はこれを純粋な SQL でかなり長い間取り組んでいましたが、見苦しくなってしまいました。その後、 PL/v8をインストールしました。約 10 分かかりました。それをインストールして (インストールはプラットフォームによって異なります)、次を実行します。

CREATE EXTENSION plv8;

それなら簡単です。関数を作成しました:

CREATE OR REPLACE FUNCTION add_to_keyed_list(obj JSON, obj_key TEXT, new_value JSON)
  RETURNS JSON
  LANGUAGE plv8
  AS $$
    obj[obj_key].push(new_value);
    return JSON.stringify(obj);
  $$
;

はい、それはデータベース内の JavaScript コードです。

クエリを実行しました:

SELECT add_to_keyed_list('{"home":["1","2","5"], "work":["15","16","19"]}'::JSON, 'home', to_json('11'::TEXT));

そして、あなたが望んでいたものを正確に取り戻しました:

{"home":["1","2","5","11"],"work":["15","16","19"]}

現時点では、PG には JSON を変更するための優れたツールはありませんが、正規表現も確かに優れたツールではありません。PL/v8 は、JSON 処理のための完全に正当な選択です。

于 2015-02-14T00:19:05.043 に答える