【问题标题】:MySQL Creating a Function with conditionalMySQL 创建一个有条件的函数
【发布时间】:2016-08-03 01:47:40
【问题描述】:

我正在尝试创建一个 mysql 函数,其条件是我必须在参数中包含某个单词才能使其工作

CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) 
DETERMINISTIC 
IF s = NULL 
THEN RETURN CONCAT('Hello World!')

所以如果查询是

SELECT hello(NULL);

那么它应该输出:

+--------------------+
| hello(NULL)        |
+--------------------+
| Hello Hello World! |
+--------------------+

否则不应返回任何行

当我尝试执行上面的代码时,它总是返回语法错误。问题是我不太擅长创建 mysql 函数,尤其是在有条件的情况下

附言

我尝试了这段代码,但出现以下错误

mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) 
    -> DETERMINISTIC 
    -> IF s IS NULL 
    -> THEN RETURN CONCAT('Hello World!');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的函数有几个语法错误:

     DELIMITER &&
    
     CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) 
     DETERMINISTIC 
     BEGIN
         IF s IS NULL THEN
             RETURN CONCAT('Hello World!');
         END IF;
     END&&
    
     DELIMITER ;
    
    • 尝试定义一个delimiter
    • 在函数体中使用beginend
    • if 子句需要 end if
    • = null 应该是 is null

    【讨论】:

      【解决方案2】:

      您需要使用IS NULLIS NOT NULL,而不是等号。因此,将您的查询更改为:

      IF s IS NULL 
      THEN RETURN CONCAT('Hello World!')
      

      请查看stackoverflow question 中的答案,该答案解释了该主题。

      【讨论】:

      • 我尝试了你的建议..但得到了一个错误..检查我更新的问题
      【解决方案3】:

      您似乎误解了SELECT 中函数的工作原理。您不能使用SELECT 中的函数过滤行。

      你可以这样做:

      select hello(null) as flag
      from dual
      having flag is not null;
      

      注意:这是HAVING的非标准用法;它是一个 MySQL 扩展。

      函数应该返回一个值。所以,你可以写:

      DELIMITER $$
      CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) 
      DETERMINISTIC 
      BEGIN
          RETURN(CASE WHEN s IS NULL 'Hello World!' END)
      END;
      $$
      DELIMITER ;
      

      此版本显式返回NULLHAVING 子句将其过滤掉。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多