带有布尔值的MySQL json_extract中的奇怪行为

时间:2019-07-15 17:32:45

标签: mysql json

在这里,我首先显示布尔json_extract的原始结果。然后,我将其与真实情况进行比较。然后在合并后再次比较为真。

MySQL [(none)]> select json_extract('{"a": true}', '$.a');
+------------------------------------+
| json_extract('{"a": true}', '$.a') |
+------------------------------------+
| true                               |
+------------------------------------+
1 row in set (0.00 sec)

MySQL [(none)]> select json_extract('{"a": true}', '$.a')=true;
+-----------------------------------------+
| json_extract('{"a": true}', '$.a')=true |
+-----------------------------------------+
|                                       1 |
+-----------------------------------------+
1 row in set (0.01 sec)

MySQL [(none)]> select coalesce(json_extract('{"a": true}', '$.a'), 'false')=true;
+------------------------------------------------------------+
| coalesce(json_extract('{"a": true}', '$.a'), 'false')=true |
+------------------------------------------------------------+
|                                                          0 |
+------------------------------------------------------------+
1 row in set (0.01 sec)

如您所见,在合并后,MySQL不知道我在那里处理json内容。

问题:我应该如何为我的json_extract提供合并后备,同时又能够将值与true进行比较?我应该使用json字符串select coalesce(json_extract('{"a": true}', '$.a'), 'false')='true'吗?我不喜欢这样,因为在不使用合并时相同的方法不起作用:

MySQL [(none)]> select json_extract('{"a": true}', '$.a')='true';
+-------------------------------------------+
| json_extract('{"a": true}', '$.a')='true' |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
1 row in set (0.00 sec)

MySQL [(none)]> select coalesce(json_extract('{"a": true}', '$.a'), 'false')='true';
+--------------------------------------------------------------+
| coalesce(json_extract('{"a": true}', '$.a'), 'false')='true' |
+--------------------------------------------------------------+
|                                                            1 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

如果有人查看了这些查询,他们会认为这是一个错误,并且如果在将来的mysql版本中“修补”了查询,则会被破坏。

实施此合并功能的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

只要合并json,就回退到json

select cast(coalesce(json_extract('{"a": true}', '$.a'), 'false') as json)=true;

enter image description here