具有布尔值的MySQL JSON_SEARCH不起作用

时间:2019-11-27 19:01:06

标签: mysql json

我正面临MySQL JSON_SEARCH函数的问题,该函数不支持布尔值搜索。

请参考以下SQL: https://rextester.com/DYLPJG17389

这是数据库架构:

create table if not exists superheroes (
    name varchar(32),
    attributes JSON
    );

insert into superheroes 
values ('Batman', '{"dead": "false", "orphan": true, "billionaire": "true", "goodboy" : "true"}');

SELECT JSON_SEARCH(attributes, 'all', 'true')
FROM superheroes
WHERE name = 'Batman';

drop table superheroes;

现在的结果是: ["$.goodboy", "$.billionaire"]

我需要我的结果应该有"$.orphan" 我无法用true替换"true",因为JSON数据来自外部来源。

谢谢。

1 个答案:

答案 0 :(得分:0)

***Library*** Library String Library Collections Library RequestsLibrary ***Variables*** ${user} = username ${passwd} = pwd &{headers} Content-Type=application/soap+xml or text/xml Authorization=Basic encrypted details ${body_request} = <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://example.com/schemas</a:Action><a:MessageID>msgid</a:MessageID><a:ReplyTo><a:Address>url</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">serviceurl</a:To></s:Header><s:Body xmlns:xsi=body"></s:Body></s:Envelope> *** Test Cases *** ${auth}= Create List ${user} ${passwd} Create Session alias=proc url=url headers=${headers} auth=${auth} Sleep 5 ${resp2} Post Request alias=proc uri=url data=${body_request} json=None params=None headers=${headers} files=None allow_redirects=True timeout=None Should Be Equal As Strings ${resp2.status_code} 200 Log To Console ${resp2.status_code} 仅适用于Docmentation所说的字符串

JSON_SEARCH
     

返回JSON文档中给定字符串的路径

还应在字符串中用双引号括住JSON值

  

JSON值可以是double quotes中的字符串,也可以是数字,也可以是true或false或null,或者是对象或数组

因此,在您的情况下,一种可能的解决方案是将布尔值JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...]) 转换为字符串true。如果无法手动更换,则可以使用"true"JSON_REPLACE更改为true。由于您已经知道必须更改其值的"true",请使用下面的查询来获得所需的结果。

key

Check your Demo here

输出:

SELECT JSON_SEARCH((JSON_REPLACE(attributes,'$.orphan',"true")), 'all', 'true') 
FROM superheroes
WHERE name = 'Batman';

更新

如果键["$.orphan", "$.goodboy", "$.billionaire"] 同时包含orphantrue,则可以使用falsecase如下所示仅替换真实值。

JSON_CONTAINS

DEMO