使用条件第二个对象构造JSON_ARRAY

Construct JSON_ARRAY with conditional second object

提问人:da Bich 提问时间:10/19/2023 更新时间:10/20/2023 访问量:33

问:

我有一个简单的示例表:

F1系列 F2系列
1 2
1 3

我想为每一行创建一个 JSON 数组 - 但是,如果第二个对象的值为 3,我不想包含它。

所以我希望结果是:

[{'num',1},{'num',2}]
[{'num',1}]

如果我尝试这个:

select JSON_ARRAY(JSON_OBJECT('num',f1),
                if(f2<>3,JSON_OBJECT('num',f2),JSON_OBJECT())                     
                  ) from sample_table;  

它关闭了,但它放置了一个空对象而不是什么都没有:

[{"num": 1}, {"num": 2}]
[{"num": 1}, {}]

有没有更好的处理方法? 否则,我想是第二种选择,有没有一种简单的方法可以在事后删除空对象(例如JSON_ARRAY函数的包装器)

我想如果我将 IF 放在开头,那可以工作.但是有没有更巧妙的方法呢?

select if(f2<>3, JSON_ARRAY(JSON_OBJECT('num',f1),JSON_OBJECT('num',f2)),
                        JSON_ARRAY(JSON_OBJECT('num',f1))                     
                  ) from sample_table;  
MySQL 的JSON

评论

0赞 da Bich 10/20/2023
我问了一种更流畅的方式,因为实际用例在对象中有许多字段,并且由于有单独的JSON_ARRAY调用,我不想第三次列出所有这些字段
0赞 Barmar 10/20/2023
我认为没有更好的方法。我测试了用作参数是否会遗漏该元素,但它会导致数组。NULLnull
0赞 Akina 10/20/2023
JSON_ARRAY将任何值都包含在最终数组中,甚至是 NULL。我建议你使用字符串函数并用它们构建一个数组。

答:

0赞 Akina 10/20/2023 #1
SELECT CONCAT( '[',
               CONCAT_WS( ',',
                          JSON_OBJECT('num',f1),
                          CASE WHEN f2<>3 THEN JSON_OBJECT('num',f2) END
                          ),
               ']'
               )
FROM sample_table

https://dbfiddle.uk/1SJR2xkU

评论

0赞 da Bich 10/20/2023
谢谢。。但就我而言,我会尽可能坚持使用 JSON 函数
1赞 Nick 10/20/2023 #2

您可以使用JSON_ARRAY_APPEND实现所需的结果,并利用以下事实:

路径未标识 JSON 文档中任何值的对将被忽略

当您不想将对象添加到数组中时,请使用虚拟路径。

select JSON_ARRAY_APPEND(
  "[]",
  '$',
  JSON_OBJECT('num',f1),
  CASE WHEN f2<>3 THEN '$' ELSE '$.dummy' END, 
  JSON_OBJECT('num',f2)
) AS result
FROM sample_table;

示例数据的输出:

结果
[{“num”: 1}, {“num”: 2}]
[{“num”: 1}]

db-fiddle 演示