结合JSON_SEARCH和JSON_EXTRACT让我:"无效的JSON路径表达式."

Jon*_*ins 4 mysql json mysql-5.7

我有一个表名称"广告系列".其中一列名为"filter_apps",其类型为JSON

我有文件行,它们只包含这样的标记数组:

["be3beb1fe916ee653ab825fd8fe022", "c130b917983c719495042e31306ffb"]
["4fef3f1999c78cf987960492da4d2a"]
["106c274e319bdeae8bcf8daf515b1f"]
["2521f0df6cffb7487d527319674cf3"]
["c130b917983c719495042e31306ffb"]
Run Code Online (Sandbox Code Playgroud)

例子:

SELECT JSON_SEARCH(filter_apps, 'one', 'c130b917983c719495042e31306ffb') FROM campaigns;
Run Code Online (Sandbox Code Playgroud)

结果:

"$[1]"
null
null
null
"$[0]"
Run Code Online (Sandbox Code Playgroud)

现在一切都正确,匹配的列回来了.如果我做一个测试,我可以证明:

SELECT JSON_EXTRACT(filter_apps, '$[1]') FROM campaigns;
Run Code Online (Sandbox Code Playgroud)

结果

"c130b917983c719495042e31306ffb"
null
null
null
null
Run Code Online (Sandbox Code Playgroud)

所以在这一点上我想我可以使用JSON_EXTRACT提取值,我的查询:

SELECT JSON_EXTRACT(filter_apps, JSON_SEARCH(filter_apps, 'one', 'c130b917983c719495042e31306ffb')) FROM campaigns;
Run Code Online (Sandbox Code Playgroud)

这导致我出错:

"[42000] [3143]无效的JSON路径表达式.错误在字符位置1附近."

Jon*_*ins 10

就那么简单:

SELECT JSON_EXTRACT(filter_apps, JSON_UNQUOTE(JSON_SEARCH(filter_apps, 'one', 'c130b917983c719495042e31306ffb'))) FROM campaigns;
Run Code Online (Sandbox Code Playgroud)

问题解决了!我将JSON_SEARCH包装在JSON_UNQUOTE方法中!

一点点提示,我在这里找到了解决方案:https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

  • 只是好奇当使用“all”搜索模式而不是“one”时,可以采取什么技巧将结果从 JSON_SEARCH 传递到 JSON_EXTRACT。 (2认同)