即使没有空答案,mysql函数也总是返回null

时间:2016-11-28 18:04:05

标签: mysql function

我的功能如下:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` FUNCTION `get_year_groups_for_visit`(id int) RETURNS varchar(200) CHARSET latin1
BEGIN
declare year_text varchar(200);

    select group_concat(year_text, ' ') into year_text from a_visit_year_group yg
join year_group y on yg.year_group_id = y.year_group_id
where yg.visitid = id;

RETURN year_text;

END

如果我使用

来调用它
select get_year_groups_for_visit(1918) 

我得到的答案为null但如果我输入

select group_concat(year_text, ' ') as 'Year Groups' from a_visit_year_group yg
join year_group y on yg.year_group_id = y.year_group_id
where yg.visitid = 1918;

我得到答案'13年级,12年级'

如果我查看表a_visit_year_group,其中visitid是1918年我得到了

> visitid   year_group_id
   1918      14
   1918      15

并且在表year_group中我得到了

> year_group_id     year_text 
  14                Year 12 
  15                Year 13

实际上,a_visit_year_group中的条目不可能具有year_group_id或visitid的空值,并且表year_group_id中的条目不可能具有year_group_id或year_text的空值,所以我不能理解为什么我只使用此函数返回空值。我已经测试了它只有一个值可以回来,哪里有几个值,它总是返回null。我知道如果你连接值并且一个值为null,答案总是为null,但这里确实没有空答案。

我现在开始把头发拉出来,因为我看不出哪里出错了,一​​定是我想念的非常简单的东西。我真的很感激一些见解。我需要获得每次访问所涉及的访问列表和年度组,有时每次访问都有几个年度组,有时只有1个,我不想每次访问多行,所以我想我可以创建一个函数将所有值作为一个

返回

1 个答案:

答案 0 :(得分:1)

您的变量与列year_text的名称相同;在你的查询中,它不会引用列,而是引用变量两次,所以你在这里连接变量。

引用documentation

  

局部变量的名称不应与表列相同。如果SQL语句(例如SELECT ... INTO语句)包含对列的引用和声明的具有相同名称的局部变量,则MySQL当前将该引用解释为变量的名称。

要么(首选)为变量使用不同的名称,要么将表(-alias)添加到列中以获得正确的范围:

select group_concat(y.year_text, ' ') into year_text 
from ... join year_group y ...