我正在转换我的一些MySQL.我正在使用JSON_OBJECT并JSON_OBJECTAGG形成JSON文档.问题是我有很多NULL字段,在这种情况下我不希望MySQL向JSON结构添加NULL字段.我希望这个领域不存在.
是否可以使用任何版本的MySQL?
扫描互联网,我发现Oracle DB中有类似内容:https: //docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/JSON_OBJECT.html#GUID-1EF347AE-7FDA -4B41-AFE0-DD5A49E8B370
有ABSENT ON NULL条款.
小智 6
我刚收到同样的问题。这是我解决它的方法:
select ...,
JSON_REMOVE(JSON_OBJECTAGG(IFNULL(column_holding_property_name, 'null__'), column_holding_property_value), '$.null__') as result_column_name
from ... group by ...;
Run Code Online (Sandbox Code Playgroud)
它将空键替换为'null__',然后将它们从最终对象中删除。所以不需要后期处理。
该JSON_REMOVE转换{"null__":1,"b":2}成{"b":2}也{"null__":1}成{},所以最终的结果总是一个对象。
顺便说一句,我使用'null__'是因为我知道它column_holding_property_value永远不会包含那个值。
解决方案一:
mysql中有一个处理这个问题的方法:
JSON_OBJECTAGG(IFNULL(key, ''), value)
Run Code Online (Sandbox Code Playgroud)
null 字段将被重新映射到 '',从而防止 SQL 错误。然后,当您解析结果时,您可以过滤掉空的“”。
这个解决方案有点依赖于能够让调用者进行查询后过滤。
解决方案2:
消除这些空值的另一种方法是添加一个 where 子句,无论它们是在对象的键中还是在值中。例如:
SELECT JSON_OBJECTAGG(color, red)
FROM ( SELECT 'color', 'red' UNION select 'color2', 'blue' UNION select 'color3', null ) AS x
WHERE red IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的空值来自左连接,并且您仍然需要空字段用于其他目的,那么这可能对您没有帮助。
如果这两种解决方案都不起作用,那么抱歉,我没有办法给你了!
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |