我有这样一个查询,它以JSON字符串的形式返回产品名称和图像数组,但是,当产品没有附加图像时,我希望这个查询为images
属性返回一个空数组。
目前,当找不到产品图像时,它返回以下内容:
{ "name": "Product Name", "images": [{"id": null, "slug": null}]}
我试图在CONCAT方法中添加IF条件,但它返回相同的响应。
SELECT p.name,
CONCAT('[',
IF(i.id = NULL,
'',
GROUP_CONCAT(DISTINCT (
JSON_OBJECT(
'id', i.id,
'slug', i.slug
)
))
),
']') AS images
FROM products AS p
LEFT JOIN _product_images AS pi ON pi.pId = p.id
LEFT JOIN images AS i ON i.id = pi.iId
WHERE p.id = 4;
谢谢大家!
3条答案
按热度按时间i1icjdpr1#
正如其他人所提到的,
i.id = NULL
的计算结果总是NULL
,但是您的方法过于复杂,并且在严格配置的服务器上会引发错误。组功能和字段的ER混合:在不带GROUP BY的聚集查询中,SELECT列表的表达式#2包含非聚集列'test.i.id';这与sql_mode=only_full_group_by不兼容
demo
因此,需要在
GROUP_CONCAT()
函数中执行检查i.id IS NULL
:但是-当你使用INNER JOIN时,你可以避免检查。但是INNER JOIN也会忽略来自
products
表的数据-所以我会在一个相关子查询中执行JOIN。最后,你可以使用JSON_ARRAYAGG()
来生成一个JSON数组。demo
demo
ryhaxcpt2#
您应该使用
IS NULL
来检查NULL
值:顺便说一句,
DISTINCT
不是函数,您不应该这样使用它,所以我删除了您使用的函数括号。**编辑:**已更新SQL以满足组限制。用于检查i.idGROUP_CONCAT之外的www.example.com的IF语句将失败,因为每行有多个图像项。
lhcgjxsq3#
IF(i.id = NULL, ...)
返回NULL
,对于包含www.example.com的任何值(甚至NULL
),这是一个伪值。i.id (evenNULL
), which is a falsy value.您希望使用
IF (i.id IS NULL, ...)
从documentation开始:
不能使用算术比较运算符(如=、〈或〈〉)来测试NULL。若要亲自演示这一点,请尝试以下查询: