首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有SELECT的简单sql函数

带有SELECT的简单sql函数
EN

Stack Overflow用户
提问于 2017-09-12 16:46:17
回答 1查看 58关注 0票数 0

我试着理解函数是如何工作的。我可以在procedure中创建相应的函数,但是不能用select创建一个简单的函数。

elementUNIQUEthingPRIMARY

代码语言:javascript
复制
CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
CHARSET utf8
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER

DECLARE @return_element VARCHAR(255);

SET @return_element = (
    SELECT
        `element`
    FROM
        `table1`
    WHERE
        `thing` = thing
);

RETURN @return_element;

我使用phpmyadmin接口。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-12 17:17:11

1)不要声明用户定义的变量。

MySQL存储程序中局部变量的名称不以at符号开头。例如:

代码语言:javascript
复制
 DECLARE stored_program_local_variable VARCHAR(255);
 SET stored_program_local_variable = 'somevalue';

用户定义变量的名称以at符号开头。( at符号字符将用户定义的变量与其他标识符区分开来。)在存储的程序中声明用户定义的变量是无效的。若要创建用户定义的变量,只需为其赋值即可。例如:

代码语言:javascript
复制
 SET @user_defined_variable = 'somevalue';

2)如果我们不需要将变量持久化到存储程序的范围之外,我们通常使用局部变量,这些变量只存在于存储的程序执行过程中。(这与处于会话级别的用户定义变量的行为不同。)

3)使用SELECT ... INTO语法将标量值检索到用户定义或局部变量中。https://dev.mysql.com/doc/refman/5.7/en/select-into.html

尝试:

代码语言:javascript
复制
DELIMITER $$

CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
... 

BEGIN
   DECLARE return_element VARCHAR(255) ;

   SELECT t1.element 
     INTO return_element 
     FROM table1 t1
    WHERE t1.thing = thing
    LIMIT 1 ;

   RETURN return_element ;

END $$

DELIMITER ;

注意:对于歧义标识符(即例程参数和SQL语句中同名的列),例程参数优先于列名。将列引用限定为表名或表别名,这样就不会有歧义。我更喜欢分配不匹配列名的例程参数(和局部变量)名称。

如果由于某种原因需要在SQL语句中为用户定义的变量赋值,则可以使用:=赋值操作符。这在存储程序的上下文之外也是有效的。

代码语言:javascript
复制
 SELECT @user_defined_variable := t.somecolumn
   FROM mytable t
  WHERE somecondition
  ORDER BY someexpression 
  LIMIT 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46181758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档