Có thể lưu trữ và truy vấn JSON trong SQLite không?


35

Tôi cần lưu trữ các đối tượng JSON trong cơ sở dữ liệu SQLite và sau đó thực hiện các truy vấn phức tạp trên nó.

Tôi đã làm một bảng như thế này:

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

cho hai đối tượng

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

Nhưng tôi không thể thực hiện các truy vấn "VÀ", như:

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

như bạn thấy, phần sau "WHERE" hoàn toàn vô nghĩa, nhưng tôi không biết làm thế nào để tạo một truy vấn sẽ làm những gì tôi muốn.

Vì vậy, bạn có nghĩ rằng có một cách tốt hơn để lưu trữ dữ liệu của tôi hoặc cách giải quyết để thực hiện truy vấn "VÀ" không?

Và tất nhiên, JSON có thể chứa bất kỳ thuộc tính nào, vì vậy tôi không thể tạo một bảng có các cột cho mỗi thuộc tính.

Tôi đang sử dụng WebQuery, đó là SQLite không có phần mở rộng.

Tôi biết câu hỏi của tôi khá cụ thể, nhưng bạn có thể giúp tôi không?


2
Nếu điều đó thực sự quan trọng đối với ứng dụng của bạn, có lẽ bạn nên sử dụng kho lưu trữ tài liệu thực ("NoQuery") hoặc ví dụ: chuyển sang Postgres kết hợp lưu trữ JSON rất hiệu quả với các tính năng quan hệ mạnh.
a_horse_with_no_name

3
Đọc tài liệu .
CL.

@CL. Yupp. Đó cũng là kết quả đầu tiên khi googling cho "sqlite json" :)
Izzy

Bạn phải có tài khoản và nên hợp nhất chúng: dba.stackexchange.com/users/81459/tuxludba.stackexchange.com/users/81513/tuxlu Bạn có thể sử dụng trang trợ giúp này: dba.stackexchange.com/help/merging-accounts
Julien Vavasseur

@Izzy Trước hết, đối với tôi, ít nhất câu hỏi này bây giờ là kết quả đầu tiên, không phải là tài liệu. Thứ hai, tiện ích mở rộng đó không phải là câu trả lời hay cho OP, người đã tuyên bố rõ ràng bằng cách sử dụng 'WebQuery, là SQLite không có tiện ích mở rộng'.
OJFord

Câu trả lời:


35

SQLite 3.9 đã giới thiệu một phần mở rộng mới ( JSON1 ) cho phép bạn dễ dàng làm việc với dữ liệu JSON.

Ngoài ra, nó cũng giới thiệu hỗ trợ cho các chỉ mục trên các biểu thức , điều này (theo cách hiểu của tôi) sẽ cho phép bạn xác định các chỉ mục trên dữ liệu JSON của mình.


7

PostgreSQL có một số tính năng hay cho lưu trữ JSON. Bạn có thể chọn các giá trị JSON bằng cách thực hiện

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

Bạn cũng có thể lập chỉ mục các khóa cụ thể trên đối tượng JSON nếu bạn sử dụng jsonbloại.


5

Các câu trả lời hiện có cho thỏa thuận này thực sự lưu trữ dữ liệu của OP dưới dạng JSON (có thể là một giải pháp tốt hơn cho vấn đề tiềm ẩn của anh ấy).

Tuy nhiên, câu hỏi thực tế là làm thế nào để tìm tài liệu trong bảng kiểu EAV được cung cấp, dựa trên nhiều thuộc tính. Vì vậy, có lẽ một câu trả lời cho câu hỏi đó sẽ hữu ích.

Cách SQL chuẩn để làm những gì bạn đang nói là TƯƠNG TÁC.

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

Bạn cũng có thể làm điều này với tự tham gia nếu bạn thích.

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"

Tất nhiên, cách "chính xác" và hiệu quả nhất có thể được cho là chỉ tạo một cột cho mỗi thuộc tính bạn cần, như 'id' và 'title'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.