MySQL函数:选择和返回列

我有一个表 Processes,它由 ID (unsigned int, auto_increment)Name (varchar, unique) 组成。

使用任何输入(无论是否在表中)选择以下函数总是会导致

错误 1172 (42000):结果包含多于一行

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$$

任何帮助表示赞赏。

更新:编辑以消除表列和函数参数之间的冲突。我不相信这是问题所在。

UPDATE2:请注意,无论输入参数是否在表中,以下内容似乎都有效。为什么在没有 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$$
stack overflow MySQL Function: Selecting and returning column
原文答案

答案:

作者头像

MySql 中的列名不区分大小写,因此您可能会发现 where Name = name 的意思是“给我每一行”。

尝试将您的过程(以及查询中的相应条件)的输入参数更改为 srchName 或与 name 不同的其他参数。

作者头像

尝试将输入 name 重命名为不同的名称,例如 inputName

更新:另一个建议。

DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;