MySQL:无法从 SELECT 语句中调用函数

标签 mysql sql function select

我在 SQL 中创建了一个名为removeYear 的函数。该函数定义为:

CREATE FUNCTION removeYear(passedTitle CHAR(255), passedYear CHAR(100))
RETURNS CHAR(255) DETERMINISTIC

功能正常。问题是我无法使用我的列名之一从 SELECT 语句中调用它。例如:

SELECT movieid, title
FROM movies
WHERE movieid = 40;

有效。

SELECT movieid, title, removeYear("bluh", movies.year)
FROM movies
WHERE movieid = 40;

有效。

SELECT movieid, title, removeYear(movies.title, movies.year)
FROM movies
WHERE movieid = 40;

报错如下: 错误代码:1054“字段列表”中的未知列“标题”

我根本知道是什么导致了这个错误。 movie.title 是有效列。我尝试用表中的所有其他列调用该函数,并且这些都工作正常。例如:

SELECT movieid, title, removeYear(movies.movieid, movies.year)
FROM movies
WHERE movieid = 40;

执行得很好。

编辑: 沮丧之余,我决定无数次检查包含该函数的 100 多行代码,最终找到了代码中导致错误的单个单词。

整个代码块中只有一次是我不小心写的

title

而不是

passedTitle

虽然我的问题已解决,但这仍然引出了一个问题:

SQL 函数是否与调用它的 SELECT 语句共享命名空间?

最佳答案

Does an SQL function share a namespace with the SELECT statement calling it?

根据您的函数签名定义

CREATE FUNCTION removeYear(passedTitle CHAR(255), passedYear CHAR(100))
RETURNS CHAR(255) DETERMINISTIC

第一个参数的值始终在函数体内使用其名称passedTitle<仅/strong>。

这适用于在任何存储过程中定义的任何参数或变量。

因此,如果您使用 title 作为第一个参数的名称,而不是签名中定义的名称 passedTitle,引擎将无法在运行时识别它并抛出错误。

关于MySQL:无法从 SELECT 语句中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751080/

相关文章:

c++ - C++ 函数中的消息传递

mysql - 如何给mysql数据库添加 super 权限?

mysql - 如何编写一个语法正确但在运行时生成错误的简短查询?

java - 如何创建独立的 SQL DB 文件以与我的 java 聊天应用程序一起使用?

sql - 从 PostgreSQL 中的时间戳中提取日期 (yyyy/mm/dd)

c - C程序输出错误

php - 使用 PHP 存储在 ASTERISK 数据库中的规则的正则表达式

mysql - 正确的数据库?需要改吗?

mysql - 无法检索左连接上的内容

c - 当应为False时返回True(C;使用函数)