提问人:da Bich 提问时间:10/19/2023 更新时间:10/20/2023 访问量:33
使用条件第二个对象构造JSON_ARRAY
Construct JSON_ARRAY with conditional second object
问:
我有一个简单的示例表:
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;
答:
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
评论
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 演示
下一个:在Laravel中上传多张图片
评论
NULL
null