MySQL功能:选择并返回列

时间:2012-10-24 21:50:07

标签: mysql sql stored-functions

我有一个表格进程,其中包含ID (unsigned int, auto_increment)Name (varchar, unique)

使用任何输入选择以下功能(无论是否在表格中)始终会产生

  

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尝试将输入name重命名为inputName等其他名称。

更新: 另一个建议...... DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;