2013-03-21 109 views
7

我使用的数据库将JSON条目存储在LONGTEXT数据类型中。我希望能够根据JSON数据来选择条目。下面是一些示例数据:MySQL REGEXP +空格( s)

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

所以我想选择包含“4d1dfd2e-7bc1-4303-9c8c-90856e918bb9” 数据:{ “项目”:{ “0”: “11”}}通过过滤掉空格通过RegExp功能(制表符,空格,新行),我曾经尝试这样做无济于事:

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

正则表达式测试工作使用Rubular和Regexpal.com但MYSQL似乎并不喜欢表达式为\ s *。有没有人有更好的解决方案呢?

回答

22

看来,MySQL不支持\s符号的正则表达式,只有[[:space:]]符号(其中[:space:],字符类中,意味着“任何空白字符”)。

顺便说一句,当你需要例如反斜杠—,当你需要的文字星号\* —你真正需要的反斜杠加倍(如\\*),根据说明§12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual

注意
因为MySQL在字符串中使用C转义语法(例如,“\n”代表换行符),所以您必须加倍使用您使用的任何“\”在你的REGEXP字符串中。

+0

感谢。是否有C转义序列处理制表符,空格和新行? (\ s的替代) – 2013-03-21 21:17:57

+0

重新阅读,查询仍然返回任何内容:(。它从''4d1dfd2e-7bc1-4303-9c8c-90856e918bb9“中断:\\ s *'...'”4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9“:\\ s * {'不起作用 – 2013-03-21 21:22:48

+0

仍然没有运气!我试过** \ {**和** \\ {** – 2013-03-21 21:29:43

0

使用字符串替换;

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

如果您的数据中有空格,则不起作用。

+0

添加查询后,ruakh张贴了一个很好的答案。读他的。 – Lighthart 2013-03-21 21:16:38

0

最好是使用JSON类型: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"