2013-03-21 2 views
7

डेटाबेस जो मैं लॉन्गथ डेटाटाइप में जेएसओएन प्रविष्टियों के साथ काम करता हूं। मैं जेएसओएन डेटा के आधार पर प्रविष्टियों को चुनने में सक्षम होना चाहता हूं।MySQL REGEXP + व्हाइटस्पेस (ओं)

{ 
    "12f9cb0a-2218-4590-a05d-c1ffab00f693": { 
     "0": { 
      "value": "test" 
     } 
    }, 
    "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { 
     "item": { 
      "0": "11" 
     } 
    } 
} 

तो मैं डेटा कि "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9" शामिल हैं का चयन करना चाहते: यहाँ कुछ उदाहरण डेटा है { "आइटम": { "0": "11"}} द्वारा

SELECT * FROM my_table WHERE (elements REGEXP BINARY '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\s*{\s*"item":\s*{\s*"0":\s*"11"\s*}\s*}'); 

regex परीक्षण Rubular और Regexpal.com लेकिन MySQL का उपयोग कर की तरह प्रतीत नहीं होता काम करता है: खाली स्थान के (टैब, रिक्त स्थान, नई लाइनों) regexp फ़ंक्शन का उपयोग को छान, मैं कोई लाभ नहीं हुआ इस की कोशिश की है \ s * अभिव्यक्ति। क्या इसके लिए किसी के पास बेहतर समाधान है?

उत्तर

22

ऐसा लगता है कि MySQL regexes में \s अंकन का समर्थन नहीं करता, केवल [[:space:]] संकेतन (जिससे [:space:], एक चरित्र वर्ग के अंदर है, जिसका अर्थ है "किसी भी खाली स्थान के चरित्र")।

संयोग से, आप कर जब, उदाहरण के लिए एक बैकस्लैश — की जरूरत है जब आप एक शाब्दिक तारांकन जरूरत \* — आप वास्तव में बैकस्लैश दोगुना करने की जरूरत है (उदाहरण के लिए \\*), §12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual में बताया गया है:

नोट
क्योंकि MySQL स्ट्रिंग्स में सी एस्केप सिंटैक्स का उपयोग करता है (उदाहरण के लिए, न्यूलाइन कैरेक्टर का प्रतिनिधित्व करने के लिए "\n"), आपको किसी भी "\" को डबल करना होगा आपके REGEXP तारों में।

+0

धन्यवाद। क्या कोई सी एस्केप अनुक्रम है जो टैब, रिक्त स्थान और नई लाइनों को संभालता है? (एक विकल्प \ 0) –

+0

फिर से पढ़ें, क्वेरी अभी भी कुछ भी नहीं लौटाती है :(। यह 4d1dfd2e-7bc1-4303-9c8c-90856e918bb9 ": \\ s * '...'" 4d1dfd2e-7bc1 से टूटता है -4303-9c8c-90856e918bb9 ": \\ s * {' –

+0

काम नहीं करता है फिर भी कोई भाग्य नहीं! मैंने कोशिश की है ** \ {** और ** \\ {** –

0

स्ट्रिंग प्रतिस्थापन का उपयोग करें;

select replace(json, ' ','') from table; 

यदि आपके डेटा में रिक्त स्थान है, तो यह काम नहीं करेगा।

+0

क्वेरी जोड़ने के बाद, खंड एक उत्कृष्ट उत्तर पोस्ट करता है। उसे पढ़ें। – Lighthart

0

यह json प्रकार का उपयोग करने के लिए बेहतर है: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"

संबंधित मुद्दे