使用条件第二对象构造JSON_ARRAY

2uluyalo  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个简单的示例表:
| 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函数的 Package 器)
我想如果我把IF放在开头,那就可以了。但还有更好的办法吗

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

tzcvj98z1#

您可以使用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上的演示

bzzcjhmw

bzzcjhmw2#

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

相关问题