我在 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/