MYSQL:如何在存储过程中按参数插入多个行值

MYSQL:如何在存储过程中按参数插入多个行值,mysql,Mysql,我在谷歌上搜索,找到了插入多行的解决方案,如下所示: CREATE PROCEDURE `usAddCostumeSet` (argUserID BIGINT, argStarOID INT, argAcc1 INT, argAcc2 INT, argBody INT, argHead INT, argNow DateTime) BEGIN INSERT INTO COSTUME (UserID, StarOID, CostumeOID, CostumeTID, I

我在谷歌上搜索,找到了插入多行的解决方案,如下所示:

CREATE PROCEDURE `usAddCostumeSet` 
    (argUserID BIGINT, argStarOID INT, argAcc1 INT, argAcc2 INT, 
     argBody INT, argHead INT, argNow DateTime)
BEGIN
    INSERT INTO COSTUME (UserID, StarOID, CostumeOID, CostumeTID, IsNewMark, CreateDate, FavDate) 
    VALUES (argUserID, argStarOID, argAcc1, argAcc1, true, argNow, null),
           (argUserID, argStarOID, argAcc2, argAcc2, true, argNow, null),
           (argUserID, argStarOID, argBody, argBody, true, argNow, null),
           (argUserID, argStarOID, argHead, argHead, true, argNow, null);

END
我希望它像下面这样

INSERT INTO COSTUME (UserID, StarOID, CostumeOID, CostumeTID, IsNewMark, CreateDate, FavDate)  
VALUES 
     if argAcc1 is not Zero (argUserID, argStarOID, argAcc1, argAcc1, true, argNow, null),
     if argAcc2 is not Zero (argUserID, argStarOID, argAcc2, argAcc2, true, argNow, null),
     if argBody is not Zero (argUserID, argStarOID, argBody, argBody, true, argNow, null),
     if argHead is not Zero (argUserID, argStarOID, argHead, argHead, true, argNow, null);

END

有一个简洁的解决方案吗?

您可以使用
插入到。。。选择

INSERT INTO COSTUME (UserID, StarOID, CostumeOID, 
                     CostumeTID, IsNewMark, CreateDate, FavDate) 
SELECT argUserID, argStarOID, 
  CASE WHEN argAcc1 <> 0 THEN argAcc1
       WHEN argAcc2 <> 0 THEN argAcc2
       WHEN argBody <> 0 THEN argBody
       WHEN argHead <> 0 THEN argHead
  END,
  CASE WHEN argAcc1 <> 0 THEN argAcc1
       WHEN argAcc2 <> 0 THEN argAcc2
       WHEN argBody <> 0 THEN argBody
       WHEN argHead <> 0 THEN argHead
  END,
  true, argNow, null
插入服装(UserID、StarOID、customoid、,
客户ID、IsNewMark、CreateDate、FavDate)
选择argUserID、argStarOID、,
argAcc1为0时的情况,然后为argAcc1
当argAcc2为0时,则为argAcc2
当argBody为0时,则为argBody
当argHead为0时,则为argHead
完,,
argAcc1为0时的情况,然后为argAcc1
当argAcc2为0时,则为argAcc2
当argBody为0时,则为argBody
当argHead为0时,则为argHead
完,,
true,argNow,null
想了一会儿

我意识到一个解决办法。使用UNIONALL

我不知道如何衡量性能或危险,这是代码

INSERT INTO COSTUME SELECT argUserID, argStarOID, tempTbl.idx, tempTbl.idx, true, argNow, null FROM (SELECT argAcc1 as idx UNION ALL
SELECT argAcc2 UNION ALL
SELECT argHair UNION ALL
SELECt argBody) as tempTbl WHERE tempTbl.idx != 0;
但毕竟我决定使用事务和多IF语句


任何建议都将被批准。。。谢谢

要插入1行还是最多4行?