我有一个 Processes 表,它由一个 ID (unsigned int, auto_increment)
和 Name (varchar, unique)
组成。
使用任何输入(无论是否在表中)选择以下函数总是导致
ERROR 1172 (42000): Result consisted of more than one row
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN myid;
END$$
但是,选择下面的函数总是返回 NULL:
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN myid;
END$$
此外,请注意以下确实会返回正确的结果(数字 30 和 50 是任意的):
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
IF myid IS NULL THEN
RETURN 30;
ELSE
RETURN 50;
END IF;
END$$
感谢任何帮助。
更新:编辑以消除表列和函数参数之间的冲突。我不认为这是问题所在。
更新 2:请注意,无论输入参数是否在表中,以下内容似乎都有效。为什么在没有 coalesce() 的情况下,即使对于表中的输入参数,该函数也会返回 NULL?
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN COALESCE(myid, 0);
END$$
最佳答案
列名在 MySql 中不区分大小写,因此您可能会发现 where Name = name
的意思是“给我每一行”。
尝试将输入参数更改为您的过程(以及查询中的相应条件)为 srchName
或不同于 name
的其他内容。
关于MySQL 函数 : Selecting and returning column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13058331/