我有两个表,一个表包含主图像行,另一个表具有备用图像。
main_table ...
id | image1 | image2 | image3 | image4 | image5 |
__________________________________________________________________________
3498 | main-1.jpg | main-2.jpg | NULL | NULL | NULL
3476 | main-1.jpg | main-2.jpg | NULL | NULL | NULL
3034 | main-1.jpg | NULL | NULL | NULL | NULL
3698 | main-1.jpg | main-2.jpg | main-3.jpg | NULL | NULL
alt_images_table ........
id | alt_image1 | alt_image2 | alt_image3
_________________________________________________________________________
3498 | alt-1.jpg | alt-2.jpg | alt-3.jpg
3476 | alt-1.jpg | alt-2.jpg | NULL
3034 | alt-1.jpg | NULL | NULL
3698 | alt-1.jpg | alt-2.jpg | alt-3.jpg
这两个表由ID联接。用alt_images_table中的alt图像填充main_table中的NULL的最佳方法是什么?我想过可能要在行中计算一个计数字段,然后再将一个图像填充到下一个数字字段中。
SET image3=
CASE
WHEN image1 is not NULL and image2 IS NOT NULL THEN alt_image1......etc.....etc....
END
但这将设置很多代码。我只是不确定是否有更好的方法。到目前为止,我在想的一切似乎都超出了代码的范围。主图像之间永远不会有空白。如示例所示,它们的数量在每一行中都不同。
谢谢
答案 0 :(得分:1)
鉴于null
值都在末尾,您可以使用case
来表达逻辑:
update maintable m join
alt_images ai
on m.id = ai.id
set m.image1 = coalesce(m.image1, a.alt_image1),
m.image2 = (case when m.image1 is null then a.alt_image2
when m.image2 is null then a.alt_image1
else m.image2
end),
m.image3 = (case when m.image1 is null then a.alt_image3
when m.image2 is null then a.alt_image2
when m.image3 is null then a.alt_image1
else m.image3
end),
m.image4 = (case when m.image1 is null then a.alt_image4
when m.image2 is null then a.alt_image3
when m.image3 is null then a.alt_image2
when m.image4 is null then a.alt_image1
else m.image4
end),
m.image4 = (case when m.image1 is null then a.alt_image5
when m.image2 is null then a.alt_image4
when m.image3 is null then a.alt_image3
when m.image4 is null then a.alt_image2
when m.image5 is null then a.alt_image1
else m.image5
end);
我意识到alt_images
的图像数量不及maintable
。但是,我保留了参考资料,因此逻辑更加清晰。