我使用的数据库以LONGTEXT数据类型存储JSON条目。我希望能够根据JSON数据选择条目。这是一些示例数据:
{
"12f9cb0a-2218-4590-a05d-c1ffab00f693": {
"0": {
"value": "test"
}
},
"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": {
"item": {
"0": "11"
}
}
}
所以我想通过过滤空白来选择包含“4d1dfd2e-7bc1-4303-9c8c-90856e918bb9”:{“item”:{“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 * 表达式。有人有更好的解决方案吗?
答案 0 :(得分:32)
似乎MySQL不支持正则表达式中的\s
表示法,只有[[:space:]]
表示法(其中[:space:]
在字符类中,表示“任何空白字符”)。
顺便提一下,当你做需要反斜杠时 - 例如,当你需要一个文字星号\*
时 - 你实际上需要加倍反斜杠(例如\\*
),如§12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual中所述:
注意
因为MySQL在字符串中使用C转义语法(例如,“\n
”来表示换行符),所以必须将在\
字符串中使用的任何“REGEXP
”加倍。
答案 1 :(得分:0)
使用字符串替换;
select replace(json, ' ','') from table;
如果您的数据中包含空格,则无效。
答案 2 :(得分:0)
最好使用json类型:
SELECT CAST(`column` AS JSON)
WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"