2012-08-23 2 views
0

MySQL의 JSON 필드에서 NoSQL을 검색 할 수있는 방법이 있습니까?MySQL NoSQL 스타일

SELECT my_json_field FROM my_table where my_json_field LIKE '% 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.name = 'John' 

감사처럼 뭔가를 필터링 할 수있는, 내가 저장하는 경우,의는 VARCHAR 필드에 "{name: 'John', surname: 'Doe', age:'30'}"을 가정 해 봅시다 의미 또는 귀하의 구조에 따라 더 일반적인 것입니다. 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 연산자와 같은 기능을 구현하면 성능이 저하 될 수 있습니다. like 대신이 목적으로 MySQL fulltext 검색을 사용하는 것이 좋습니다.

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''}' 
당신은 그것이 stopword (즉, 검색어에서 무시됩니다)이기 때문에 내가 쿼리에 '이름'filedname을 추가하지 않은 것을 알 수 있습니다

.

또한 "fieldname : 'value'"쌍을 검색하려면 특수 문자를 처리하는 방법을 찾아야합니다.