क्या SQL में JSON को स्टोर और क्वेरी करना संभव है?


35

मुझे JSON ऑब्जेक्ट्स को SQLite डेटाबेस में संग्रहीत करने की आवश्यकता है, और फिर उस पर जटिल प्रश्न करें।

मैंने इस तरह से एक तालिका बनाई:

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

दो वस्तुओं के लिए

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

लेकिन मैं "एंड" क्वेश्चन नहीं कर सकता, जैसे:

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

जैसा कि आप देख रहे हैं, "WHERE" के बाद का हिस्सा कुल बकवास है, लेकिन मुझे इस बात का कोई पता नहीं है कि एक क्वेरी कैसे बनाई जाए जो मुझे चाहिए।

तो क्या आपको लगता है कि मेरे डेटा को स्टोर करने का एक बेहतर तरीका है, या "एंड" क्वेरी करने के लिए एक वर्कअराउंड?

और हां, JSON में कोई भी संपत्ति हो सकती है, इसलिए मैं प्रत्येक गुण के लिए कॉलम के साथ तालिका नहीं बना सकता।

मैं WebSQL का उपयोग कर रहा हूं, जो बिना एक्सटेंशन के SQLite है।

मुझे पता है कि मेरा प्रश्न बहुत विशिष्ट है, लेकिन क्या आप मेरी मदद कर सकते हैं?


2
यदि यह आपके आवेदन के लिए वास्तव में महत्वपूर्ण है, तो आप शायद एक वास्तविक दस्तावेज़ स्टोर ("नोएसक्यूएल") या उदाहरण के लिए पोस्टग्रेज पर स्विच कर सकते हैं जो मजबूत रिलेशनल विशेषताओं के साथ बहुत कुशल JSON स्टोरेज को जोड़ती है।
a_horse_with_no_name

3
प्रलेखन पढ़ें ।
सीएल।

@CL। Yupp। "साइक्लाइट जोंस" के लिए गुगली करते समय यह भी पहला परिणाम है :)
इज़्ज़ी

आपको खाते और उन्हें मर्ज करना चाहिए: dba.stackexchange.com/users/81459/tuxlu और dba.stackexchange.com/users/81513/tuxlu आप इस सहायता पृष्ठ का उपयोग कर सकते हैं: dba.stackexchange.com/help/merging/accounts
जूलियन वावसूर

@ सबसे पहले, मेरे लिए कम से कम यह प्रश्न अब पहला परिणाम है, डॉक्स नहीं। दूसरे, वह विस्तार ओपी के लिए एक अच्छा जवाब नहीं है, जो स्पष्ट रूप से 'वेबएसक्यू, जो बिना एक्सटेंशन के SQLite है' का उपयोग करते हुए कहा गया है।
OJFord

जवाबों:


35

SQLite 3.9 ने एक नया एक्सटेंशन ( JSON1 ) पेश किया जो आपको JSON डेटा के साथ आसानी से काम करने की अनुमति देता है।

इसके अलावा, इसने अभिव्यक्तियों पर अनुक्रमित के लिए समर्थन पेश किया , जो (मेरी समझ में) आपको अपने JSON डेटा पर भी अनुक्रमित को परिभाषित करने की अनुमति देनी चाहिए।


7

PostgreSQL में JSON स्टोरेज के लिए कुछ अच्छे फीचर्स हैं। आप JSON मान का चयन करके कर सकते हैं

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

यदि आप jsonbटाइप करते हैं तो आप JSON ऑब्जेक्ट पर विशिष्ट कुंजियों को भी अनुक्रमित कर सकते हैं ।


5

वास्तव में ओपी के डेटा को JSON (जो उसकी अंतर्निहित समस्या का एक बेहतर समाधान हो सकता है) को संग्रहीत करने के साथ इस सौदे के लिए मौजूदा उत्तर।

हालांकि, वास्तविक प्रश्न यह था कि एकाधिक गुणों के आधार पर प्रदान किए गए ईएवी-शैली तालिका में दस्तावेज़ कैसे प्राप्त करें। तो, शायद उस प्रश्न का उत्तर उपयोगी होगा।

आप जो कह रहे हैं उसे करने का मानक 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"

बेशक अधिक "सही" और यकीनन सबसे कुशल तरीका यह होगा कि आप अपनी जरूरत की प्रत्येक संपत्ति के लिए एक कॉलम बनाएं, जैसे 'आईडी' और 'शीर्षक'।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.