問題タブ [postgresql-json]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - UPSERT テスト コードの構文エラー
次のテスト コードを使用して新しい PostgreSQLアップサート構文をテストしようとしていますが、構文エラーが発生します。
上記のコードが失敗するのはなぜですか?
また、test1
テーブルにはいくつかの制約があります (非負の値と一意の主キー)。一意性制約のみに対処する方法は?
更新 2:から に切り替えましUPDATE
たINSERT
(ばかげた間違いで申し訳ありません!) が、まだ構文に苦労しています:
また、JSON 行を次のように変更しようとしました。
しかし、それも失敗します...
便宜上、私のテストコードを次に示します。
postgresql - JSONB_ARRAY_ELEMENTS を WHERE ... IN 条件で使用する
オンライン ポーカー プレイヤーは、オプションでプレイルーム 1 またはプレイルーム 2 へのアクセスを購入できます。
また、不正行為のために一時的に禁止される可能性があります。
上記の表には、4 つのテスト レコードが含まれています。
4 つのレコードはすべて、異なるソーシャル ネットワーク (たとえば、Facebook、Twitter、Apple Game Center など) を介して自分自身を認証した同一人物のものです。
数値のユーザー ID のリストを (JSON 配列として) 取り、同じ人物に属するレコードを単一のレコードにマージするストアド関数を作成しようとしています - 彼女の支払いや罰を失うことはありません:
残念ながら、これを使用すると次のエラーが発生します。
問題を解決するのを手伝ってください。
便宜上、ここに SQL コードの要旨を示します。
arrays - JSONB_ARRAY_ELEMENTS の結果を VARCHAR 配列に割り当てる
JSONB_ARRAY_ELEMENTS呼び出しの結果をVARCHAR 配列に割り当てようとすると(後でSELECT ... WHERE IN (UNNEST(...))
ステートメントで使用するため)、次のストアド関数:
残念ながら、エラーが出力されます:
だから私はARRAY_AGGを使用して割り当てを修正しようとしました-
しかし、構文エラーが発生します:
JSONB_ARRAY_ELEMENTS
結果を配列に保存する方法を教えてください。
アップデート:
私は Nick のアドバイスに従いました (ありがとう)。
SELECT ... WHERE IN ...
ステートメントで配列を使用しようとすると:
json - サブセレクトでjsonbの結果をフィルタリングする
複数のテーブルから階層的な JSON 結果を作成しています。これらは単なる例ですが、このデモンストレーションの目的を理解するのに十分なはずです。
テストデータ:
次の関数を作成しました。
関数の実行book_get
次の結果が生成されます
WHERE
これで、句を使用してデータをフィルタリングできるようになりました。
でフィルタリングできるようにするにはどうすればよいauthors
ですか? たとえば、 に相当するものWHERE _b.authors.'name' = 'Arthur C. Clarke'
。
authors
どのタイプになるか全くわかりません。それとも?それはまだレコード(配列)ですか?もうJSONですか?にアクセスできるからだと思いますid
が、アクセスすることはそれほど問題ではありませんか?title
pages
_b.authors
アクセス_b.authors
すると私にERROR: missing FROM-clause entry for table "authors"
JSON 演算子でアクセスすると、_b.authors->>..
または_b->authors->>..
句で使用GROUP BY
したことを覚えています:HAVING
しかし、それは私にエラーを与えます:
エラー: タイプ json の等価演算子を識別できませんでした
もう少し明確にするために:
基本的に必要なことを行います。これは、インデックスの作成者が である場合にのみ一致し0
ますArthur C. Clarke
。彼が本を共同執筆し、彼が 2 位 (インデックス 1) だった場合、一致はありませんでした。だから私が見つけようとしているのは、_b.authors
たまたま著者で満たされた JSON 配列であるスキャンの正しい構文です。どんな試みも受け入れません。私が理解している限りでは@>
、#>
のみがサポートされていJSONB
ます。_b.authors
では、値に対して任意の列を選択する際に正しい構文を取得するにはどうすればよいですか。
更新 2
ドキュメントをもう一度読んでください... Postgresのドキュメントから、関数に関してJSONとJSONBに違いがあるという部分を取得できなかったようです。データ型のみに関するものだと思いました。where 句で etc のような演算子を使用すると、と置き換えるto_json
とうまくいくようです。to_jsonb
@>
アップデート 3
@ErwinBrandstetter: 理にかなっています。LATERAL は私にはまだ知られていませんでしたが、存在することを知ってよかったです。私は JSON/JSONB の関数と演算子に慣れてきました。今ではとても理にかなっています。私には明確ではないのはLIKE
、たとえばWHERE
節での出現を見つけることです。
jsonb_array_elements
配列内のオブジェクトのネストを解除するために使用する必要がある場合(最後のWHERE
節では、の内容がb.authors
JSONB データ型であるため)。私はそれからすることができました
望ましい結果が得られます。
しかし、私の例の最後の(最後の)WHERE
節でこれを達成するためのアプローチは何ですか? WHERE
結果の完全なセットをフィルタリングし、サブ選択の途中で部分的にフィルタリングしたくないため、最後の句を指摘します。したがって、一般的には、著者のミドルネームが「C」である本を最終的な結果セットから除外したいと考えています。または名前「アーサー」。
更新 4
FROM
もちろん節で。すべての可能性を見つけたら、最後にパフォーマンスの微調整を行う必要がありますが、これが私が思いついたものです。
'Arthur' で始まる著者名を持つすべての本を提供します。このアプローチへのコメントや更新に感謝します。
python - この SQL ステートメントの django ORM バージョンはありますか?
Django 1.9 と Postgres 9.4 を使用。
と呼ばれるjsonbフィールドがありjson_field
ます。json_field
のようなキーtitle
を含めることができます'the cow jumped over the moon'
。
title
だから私は含む行を検索したいmoon
。
次の生の SQL を使用して適切に動作します
SELECT * FROM web_file where (json_field ->> 'title')::text LIKE '%moon%';
しかし、私はむしろ Django ORM を使用してそれを行いたいと思います。
編集:
私は試してみようと思いました(そして@kloddantが指摘したように)
しかし、次のエラーが発生します
関連はこちらmodels.py
疑わしいですが、djangoモデルとMPTTModelの衝突である可能性がありますか?
postgresql - postgresql ビュー/関数で 2 つの json オブジェクトをマージする
私はポストグレスに次の3つのテーブルを持っています...
住所コンポーネントには次のようなデータがあります...
従業員は複数の住所を持つことができ、各住所は 1 つの住所コンポーネントに関連付けられます。
address を json として、 address_component を別の json としてアドレス オブジェクト内に埋め込みたいと考えています。
これにより、アドレスの配列をjsonとして正しく取得できますが、一時的にアドレスコンポーネントを別の結果として取得できます。この address_component json を address json 配列の個々の要素にマージして、以下のような出力を得ることができますか?