我在MySQL中有以下查询。这会将新项目插入到列表中,其中新项目的位置设置为大于当前最大位置的位置。
INSERT INTO items
SET item_name="apple",
position=(SELECT MAX(i.position)+1 FROM items i WHERE i.list_id=12),
list_id=12
这样可行,但对于position
,如果SELECT语句返回空集,我想插入0。这可以在一个查询中执行(这样我可以避免使用事务)吗?
答案 0 :(得分:2)
尝试COALESCE():
INSERT INTO items
SET item_name="apple",
position=COALESCE((SELECT MAX(i.position)+1 FROM items i WHERE i.list_id=12), 0),
list_id=12
答案 1 :(得分:1)
使用CASE
通过执行position
来检查您是否有IS NULL
。如果不这样做,只需使用0.
INSERT INTO items
SET item_name="apple",
position=( CASE WHEN (SELECT MAX(i.position)+1 FROM items i WHERE i.list_id=12) IS NULL
THEN 0 ELSE (SELECT MAX(i.position)+1 FROM items i WHERE i.list_id=12) END ) ,
list_id=12
请参阅demo
虽然这有效,但请参阅@keyfix的更好答案以及here的演示。