【问题标题】:combine CONCAT() and COALESCE() to generate JSON in MySQL结合 CONCAT() 和 COALESCE() 在 MySQL 中生成 JSON
【发布时间】:2016-08-10 01:21:23
【问题描述】:

我正在从函数构建小的 JSON 块,我需要过滤空值,同时引用这样的非空值(MySQL 5.0,因此没有内置的 JSON 函数):

COALESCE(CONCAT('[', 
    group_concat(
        CONCAT('{ "key": "', REPLACE(a.val, '"', '\\"'), '"}') 
        SEPARATOR ', ')
, ']'), 'null') AS jsonval

输出类似这样的内容(这是一个嵌入到完整 JSON 块中的值):

  • 带有值:[{"key": "foo"}, {"key": "bar"}, {"key": "baz"}]
  • 没有值(NULL):null
  • 带有空字符串:[{"key": ""}]

对于每个a.val,我想在我的列表中添加一个条目,但如果没有找到值,则使用字符串null 而不是完整列表。它工作得很好,但我需要在结果 JSON 中将空字符串和 NULL 值处理为 null。

REPLACE()CONCAT()COALESCE() 可以很好地协同处理空值,但未检测到空字符串,如何以相同的方式处理 NULL 和空字符串?

我已经看到 this question 关于删除空值,我正在寻找相反的情况。

【问题讨论】:

  • 为什么要从 SQL 代码中生成 JSON?一般来说,您不应该这样做(因为这是应用程序/数据传输问题,而不是数据库操作)。
  • 我也不应该使用 MySQL 5.0... 业务需求!此 JSON 不应传输,但用于报告/维护目的,我们无法添加用于导出的外部工具。

标签: mysql json null coalesce


【解决方案1】:

只是重复你的想法!

COALESCE(CONCAT('[', 
    group_concat(
        CONCAT('{ "key": ',COALESCE(CONCAT('"', REPLACE(a.val, '"', '\\"'), '"'), 'null') ,'}') 
        SEPARATOR ', ')
, ']'), 'null') AS jsonval

修改后:

COALESCE(CONCAT('[', 
    group_concat(
        CONCAT('{ "key": ',
            CASE WHEN a.val IS NULL THEN 'null'
                 WHEN a.val = ''    THEN 'null'
                 ELSE CONCAT('"', REPLACE(a.val, '"', '\\"'), '"')
            END
        ,'}')
    SEPARATOR ', ')
, ']'), 'null') AS jsonval

【讨论】:

  • 也试过了...问题是 REPLACE(NULL, 'foo','bar') 将返回一个空字符串,而不是 NULL 所以 COALESCE 永远不会触发
  • 在我的测试中工作正常。可能是一个配置。选择 COALESCE(CONCAT('foo',REPLACE(NULL, 'foo','bar'),'bar'),'nUlL') 作为结果; +--------+ |结果 | +--------+ |空| +--------+
  • 好吧,我的错,数据库中的假空字符串。
  • 工作正常,但我认为有错字,您应该删除第二个“CASE”,我无法编辑您的帖子(字符不足)
  • 是的!对不起,很高兴能帮上忙!好问题
猜你喜欢
  • 2021-07-04
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
相关资源
最近更新 更多