2012-08-23 17 views
0

有沒有一種方法可以在MySQL中的JSON字段中搜索la la NoSQL? 我的意思是,如果我保存,讓我們說,"{name: 'John', surname: 'Doe', age:'30'}"VARCHAR領域,我可以選擇和喜歡MySQL在哪裏la NoSQL風格

SELECT my_json_field FROM my_table where my_json_field.name = 'John' 

關心的東西過濾它

+0

這並不容易:每次搜索時都必須實際解碼JSON。檢查[這篇冗長的文章](http://tech.livingsocial.com/2008/04/14/mysql-stored-function-parsing-a-json-encoded-string.html):這些傢伙的解決方案可用於也可以查詢,但這不是很高效,可以說。 – raina77ow

+0

這不是更接近我所尋找的。他們只是威脅這個領域是一個普通的字符串。我會尋找能夠讓MySQL _understand_ JSON的東西。 – alexandernst

+0

儘管MySQL能夠以JSON格式輸出,但我認爲支持JSON類型字段(例如DB2中的XML類型)還有很長的路要走。 – raina77ow

回答

0

有沒有這樣的事情。 MySQL只是不會理解JSON和編寫正則表達式匹配或其他任何只是要求麻煩。

1

爲什麼不喜歡這樣的:

SELECT my_json_field FROM my_table where my_json_field LIKE '% name:\'John\' %' 

或更一般的,取決於你的結構my_json_field

SELECT my_json_field FROM my_table where my_json_field LIKE '% name: \'John\' %' 
+0

你也必須在字符串中包含引號:'LIKE'%name:\'John \'''' –

+0

顯然這是一個例子。我不知道該字段中將存儲什麼類型的JSON對象或它將具有多少級別。 +可能有一個「'''WHERE name ='John'AND age> 40'''」 – alexandernst

+0

您可以在應用程序端建立LIKE的參數。例如:「'%」+ field_name +「:'」+ value +「'%'」。 對於非正則表達式謂詞,這確實沒有用。年齡> 40歲將無法工作。對於這種情況,您唯一能做的就是使用字符串函數來提取字段值並將其與您的過濾值進行比較。 – Razvan

0

使用like運算符實現此功能可能會導致性能下降。我建議使用MySQL fulltext搜索此目的而不是like

create table my_table (my_json_field text); 

ALTER TABLE my_table ADD FULLTEXT(my_json_field); 

insert into my_table (my_json_field) values ("{name: 'John', surname: 'Doe', age:'30'}"); 

insert into my_table (my_json_field) values ("{name: 'Pope', surname: 'Benedict', age:'666'}"); 

select * 
from my_table 
where MATCH(my_json_field) AGAINST ("Pope" IN BOOLEAN MODE); 
'{name: ''Pope'', surname: ''Benedict'', age:''666''}' 

select * 
from my_table 
where MATCH(my_json_field) AGAINST ("John" IN BOOLEAN MODE); 
'{name: ''John'', surname: ''Doe'', age:''30''}' 

您可能注意到,我沒有在「名稱」 filedname添加到查詢,因爲它是一個stopword(即在搜索詞忽略)。

此外,如果您想要搜索「fieldname:'value'」對,則必須找到處理特殊字符的方法。