MySQL功能:选择并返回列

问题描述 投票:3回答:2

我有一个表进程,其中包括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$$

任何帮助表示赞赏。

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

更新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 sql stored-functions
2个回答
0
投票

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

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


0
投票

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

更新:另一个建议...... qazxsw poi qazxsw poi qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.