JSONをSQLiteに保存およびクエリできますか?


35

JSONオブジェクトをSQLiteデータベースに保存してから、複雑なクエリを実行する必要があります。

私はこのようなテーブルを作りました:

+--------------------------------------+
|document |  property | string | number|
+--------------------------------------+
|foo      |  "title"  | "test" |       | 
+--------------------------------------+
|foo      |  "id"     |        |  42   | 
+--------------------------------------+
|bar      |  "id"     |        |  43   | 
+--------------------------------------+

2つのオブジェクト用

foo {"title": "test", "id": 42} 
bar {id: 43}

ただし、次のような「AND」クエリは実行できません。

SELECT DISTINCT id  FROM table WHERE title = "test" AND id = 42 

ご覧のとおり、 "WHERE"の後の部分はまったくナンセンスですが、私が望むことをするクエリを作成する方法がわかりません。

データを保存するより良い方法、または「AND」クエリを実行する回避策があると思いますか?

もちろん、JSONには任意のプロパティを含めることができるため、各プロパティの列を含むテーブルを作成することはできません。

拡張機能のないSQLiteであるWebSQLを使用しています。

私の質問はかなり具体的ですが、助けていただけますか?


2
それがアプリケーションにとって本当に重要な場合は、おそらく実際のドキュメントストア( "NoSQL")を使用するか、非常に効率的なJSONストレージと強力なリレーショナル機能を組み合わせたPostgresに切り替えることをお勧めします。
a_horse_with_no_name

3
ドキュメントを読んでください。
CL。

@CL。ユップ。これは、「sqlite json」のグーグル検索時の最初の結果でもあります:)
Izzy

アカウントが必要であり、それらをマージする必要があります:dba.stackexchange.com/users/81459/tuxluおよびdba.stackexchange.com/users/81513/tuxluこのヘルプページを使用できます:dba.stackexchange.com/help/merging-accounts
ジュリアンバヴァッセル

@Izzyまず第一に、少なくとも私にとって、この質問はドキュメントではなく最初の結果です。第二に、その拡張はOPに対する良い答えではありません。OPは「WebSQL、これは拡張のないSQLite」を使用して明示的に述べました。
OJフォード

回答:


35

SQLite 3.9では、JSONデータを簡単に操作できる新しい拡張機能(JSON1)が導入されました。

また、式のインデックスのサポートを導入しました。これにより、(私の理解では)JSONデータのインデックスも定義できるようになります。


7

PostgreSQLにはJSONストレージ用の優れた機能がいくつかあります。次のようにして、JSON値を選択できます。

SELECT DISTINCT FROM TABLE WHERE foo->title=test AND id=42

jsonbタイプを使用する場合、JSONオブジェクトの特定のキーにインデックスを付けることもできます。


5

このための既存の答えは、OPのデータを実際にJSONとして保存することです(これは、彼の根本的な問題に対するより良い解決策だったかもしれません)。

ただし、実際の問題は、複数のプロパティに基づいて、提供されたEAVスタイルのテーブルでドキュメントを検索する方法です。したがって、おそらくその質問への回答が役立つでしょう。

あなたが言っていることをする標準的なSQLの方法はINTERSECTIONです。

(SELECT document FROM table WHERE property="id" AND number=43)
INTERSECTION 
(SELECT document FROM table WHERE property="title" AND string="test")

必要に応じて、自己結合を使用してこれを行うこともできます。

SELECT t1.document
FROM table as t1, table as t2
WHERE t1.document = t2.document
AND t1.property="id" AND t1.number=43
AND t2.property="title" AND t2.string="test"

もちろん、より「正確」で間違いなく最も効率的な方法は、「id」や「title」など、必要な各プロパティの列を作成することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.