MySQL 函数 : Selecting and returning column

标签 mysql sql stored-functions

我有一个 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/

相关文章:

python - 如何在一对一关系可能不同的反向一对一关系中预取相关?

c# - 如何在 ado.net 中执行表值函数?

mysql - Ant: i/o 重定向 "must not contain the ' <' character"

php - 根据 MYSQL 值更改单元格颜色

sql - 使用 varchar 数据类型进行 PIVOT

sql - Postgres - 如何创建字母数字序列,如 AAAA0000 等

php - 从表中获取其他表没有的结果

mysql - 从elasticsearch、mysql、google Analytics、日志获取数据并创建统计数据

entity-framework - 无法生成存储函数的函数导入返回类型

c++ - 将 Informix Object Interface for C++ 用于不带参数的存储过程/函数