SQLite에서 JSON을 저장하고 쿼리 할 수 ​​있습니까?


34

JSON 객체를 SQLite 데이터베이스에 저장 한 다음 복잡한 쿼리를 수행해야합니다.

나는 이런 식으로 테이블을했다 :

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

두 개체를 위해

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. pp. "sqlite json"에 대한 인터넷 검색시 첫 번째 결과입니다.
Izzy

dba.stackexchange.com/users/81459/tuxludba.stackexchange.com/users/81513/tuxlu 계정을 가져와 병합해야합니다. 이 도움말 페이지를 사용할 수 있습니다. dba.stackexchange.com/help/merging-accounts
Julien Vavasseur

@Izzy 우선, 적어도이 질문은 이제 문서가 아닌 첫 번째 결과입니다. 둘째,이 확장 은 OP에 대한 좋은 대답이 아니며, '확장자가없는 SQLite 인 WebSQL'을 명시 적으로 언급했습니다.
OJFord

답변:


32

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.