带有嵌套 IF...END IF 的 MySQL 存储函数,语法错误,在 '' 附近使用正确的语法

标签 mysql mysql-error-1064 stored-functions create-function

我有一个目前在 PHP 中使用的函数,它从不同的字段编译邮寄地址,但考虑了不同地区使用的不同格式。我正在尝试将其复制为 MySQL 存储函数。我意识到在代码中而不是在数据库中执行此类操作通常更快,但是我们的内部网有一种方法可以让人们以只读方式输入原始 MySQL SELECT 命令,这样他们就可以构建高级搜索并保存查询。将使用此特定功能,以便用户可以将他们的高级搜索查询结果输出到标签布局。

当我尝试使用 phpMyAdmin 3.4.9(最新稳定版)存储函数时,出现以下错误:

#1064 - 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 51

我还安装了最新的 MySQL Workbench 并得到了同样的错误,但它也突出显示了“'END' 附近的 SQL 语法错误”所以它不仅仅是 phpMyAdmin 中的错误(尽管它可能是 phpMyAdmin 和 MySQL Workbench 中的错误).

这是函数查询:

DELIMITER ;;
DROP FUNCTION IF EXISTS ADDRESS_BUILD;;
CREATE FUNCTION ADDRESS_BUILD(contact VARCHAR(50), company VARCHAR(100), add1 VARCHAR(255), add2 VARCHAR(255), add3 VARCHAR(255), town_city VARCHAR(50), county_state VARCHAR(50), postcode_zip VARCHAR(50), country VARCHAR(100), `separator` VARCHAR(10), type VARCHAR(10))
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE address TEXT;
DECLARE line TEXT;

IF LENGTH(TRIM(contact))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(contact)); END IF;
IF LENGTH(TRIM(company))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(company)); END IF;
IF LENGTH(TRIM(add1))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add1)); END IF;
IF LENGTH(TRIM(add2))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add2)); END IF;
IF LENGTH(TRIM(add3))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add3)); END IF;

IF country='United States of America' OR country='USA' OR country='Canada' OR country='CA' THEN 
    /* NORTH AMERICA, ALL ON 1 LINE */
    IF LENGTH(TRIM(town_city))>0 THEN 
        IF type='mail' THEN SET line=CONCAT_WS('', TRIM(town_city), ' ');
        ELSE SET line=CONCAT_WS('', line, TRIM(town_city), ', ');
        END IF;
    END IF;

    IF LENGTH(TRIM(county_state))>0 THEN 
        IF type='mail' THEN SET line=CONCAT_WS('', line, TRIM(county_state), '  ');
        ELSE SET line=CONCAT_WS('', line, TRIM(county_state), ' ');
        END IF;
    END IF;

    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF;

    SET address=CONCAT_WS(`separator`, address, TRIM(line));

ELSE IF country='United Kingdom' OR country='UK' THEN 
    /* UK, ASCENDING LOCALITY SEPARATE LINES */
    IF LENGTH(TRIM(town_city))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(town_city)); END IF;
    IF LENGTH(TRIM(county_state))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(county_state)); END IF;
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(postcode_zip)); END IF;

ELSE
    /* EUROPE EVERYWHERE ELSE, ALL ON 1 LINE POSTCODE FIRST */
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF;
    IF LENGTH(TRIM(town_city))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(town_city)); END IF;
    IF LENGTH(TRIM(county_state))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(county_state)); END IF;
    IF LENGTH(TRIM(line))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(line)); END IF;
END IF;

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA');
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country));
END IF;

RETURN address;
END;;

第 51 行靠近 END IF、RETURN 和 END 子句,但我看不出有什么问题。

任何人都可以在 MySQL Workbench 和 phpMyAdmin 中看到导致此问题的原因吗?
存储函数后,我就可以对其进行测试并调整逻辑。

此外,如果函数中有任何可以简化的内容,请告诉我。那里的示例不多,所以我将其拼凑在一起。

最佳答案

好的,我要回答我自己的问题。感谢 Yahia,我重新审视了我的 IF 语句语法。
原来我搞砸了查询!

上面有 2 个 ELSE IF 子句。
根据 http://dev.mysql.com/doc/refman/5.0/en/if.html 的正确语法实际上是 ELSEIF
我只是假设因为 END IF 它也应该是带空格的 ELSE IF ,而实际上并没有从文档中确定。

因此 MySQL 非常正确地将 ELSE IF 解释为 ELSE 然后是另一个嵌套 IF 的开始,而不是同一级别的另一个分支。

在您更正 ELSE IF 后,上述查询在 phpMyAdmin 中完美运行,但我对逻辑进行了一些调整。

所以都是我的错,RTM!

关于带有嵌套 IF...END IF 的 MySQL 存储函数,语法错误,在 '' 附近使用正确的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048931/

相关文章:

php - 试图用 WHERE NOT EXISTS 显示两个表中的数据

mysql - SQL:将每个 ID 的值合并到一个变量中

mysql - 该代码是 Joomla Radon 模板示例数据的开始。语法错误出现在第9行。不幸的是我没有发现哪里出了问题

mysql - MySQL 函数出现 '' 附近的奇怪错误

mysql - 存储过程不存在,即使在创建之后

python django 竞争条件与 celery

sql - 有没有办法在 MySQL 中选择最大行 id,而无需使用 MAX() 扫描所有行?

mysql - 尝试并捕获插入 MySQL 中的 MysqlCmd.ExecuteNonQuery

mysql - 使用 SELECT INTO OUTFILE 时出现语法错误

mysql - 变量表名称 MySQL 存储函数