INSERT INTO with SELECT ....如果SELECT返回0行怎么办?

时间:2017-07-27 15:37:01

标签: mysql sql

我有一个包含以下代码的存储过程:

INSERT INTO vt_benutzer_medien_liste (`BenutzerID`, `ReportID`, `MedienDateiTypID`, `Dateiname`, `Dateidatum`, `Dateigroesse`, `Bemerkungen`)
SELECT UserID, ReportID, COALESCE(vtmd.ID,16), Filename, FileDate, FileSize, Message 
FROM vt_medien_dateityp AS vtmd 
WHERE vtmd.Dateiendung = SUBSTRING_INDEX(Filename,'.',-1)
LIMIT 1

UserID,ReportID,Filename,FileDate,FileSize和Message是参数

插入部分工作正常。将参数“Filename”中提供的fileextension与表vtmd中的fileextensions列表进行比较。 只要filettension存在于vtmd中,这也可以正常工作。

如果没有,它应该得到默认值16 - > COALESCE(vtmd.ID,16) 但这并没有发生。该过程完成没有任何错误,并且没有进行任何插入,因为SELECT查找/返回没有行。

我该怎么办?

PS:别名是为了便于阅读。

更新

SELECT返回一个空结果。我希望将16作为默认值返回。

2 个答案:

答案 0 :(得分:2)

如果你的SELECT没有返回任何行,那么INSERT就没有了。由于SELECT没有行,因此COALESCE不会强制执行INSERT,即使您为所有列指定了COALESCE,如果没有从SELECT返回任何行,也不会插入任何内容。

返回行中的空值与根本没有行之间存在差异。

答案 1 :(得分:1)

这有效:

BEGIN
SELECT @XDateiTypID := COALESCE((SELECT ID FROM vt_medien_dateityp WHERE Dateiendung = SUBSTRING_INDEX(Filename,'.',-1) LIMIT 1),16);
INSERT INTO vt_benutzer_medien_liste (`BenutzerID`, `ReportID`, `MedienDateiTypID`, `Dateiname`, `Dateidatum`, `Dateigroesse`, `Bemerkungen`)
VALUES (UserID, ReportID, @XDateiTypID, Filename, FileDate, FileSize, Message);
END
  1. 将SELECT作为变量处理(在我的情况下, @XDateiTypID )。
  2. 如果变量保持 NULL ,则使用默认值(在我的情况下为16)的COALESCE将覆盖该变量。
  3. 之后,只需使用VALUES部分中的变量就可以了。
  4. PS:BEGIN .. END needed因为它是一个存储过程。