MySQL存储函数与嵌套IF … END IF,语法错误,正确的语法使用”附近”

我有一个函数,我目前在PHP中使用它编写来自不同字段的邮件地址,但考虑到不同地区使用的不同格式.我试图将其复制为MysqL存储函数.我意识到在代码中而不是在数据库中执行此类操作通常会更快,但我们的Intranet可以让人们以只读方式输入原始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`,TRIM(company)); END IF;
IF LENGTH(TRIM(add1))>0 THEN SET address=CONCAT_WS(`separator`,TRIM(add1)); END IF;
IF LENGTH(TRIM(add2))>0 THEN SET address=CONCAT_WS(`separator`,TRIM(add2)); END IF;
IF LENGTH(TRIM(add3))>0 THEN SET address=CONCAT_WS(`separator`,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,',');
        END IF;
    END IF;

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

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

    SET address=CONCAT_WS(`separator`,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`,TRIM(town_city)); END IF;
    IF LENGTH(TRIM(county_state))>0 THEN SET address=CONCAT_WS(`separator`,TRIM(county_state)); END IF;
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET address=CONCAT_WS(`separator`,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('',TRIM(postcode_zip)); END IF;
    IF LENGTH(TRIM(town_city))>0 THEN SET line=CONCAT_WS('',' ',TRIM(town_city)); END IF;
    IF LENGTH(TRIM(county_state))>0 THEN SET line=CONCAT_WS('',TRIM(county_state)); END IF;
    IF LENGTH(TRIM(line))>0 THEN SET address=CONCAT_WS(`separator`,TRIM(line)); END IF;
END IF;

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`,'USA');
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`,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!

相关文章

目录MySQL卸载环境查看是否已安装MySQL卸载mysql服务查看是否...
目录数据类型数据类型分类数值类型以TINYINT认识整型族有符号...
目录表的约束空属性非空约束(NOT NULL Constraint)默认值定...
目录函数时间日期函数:字符串函数数学函数其他函数 函数 时间...
目录使用C语言连接库的安装C APImysql_initmysql_real_conne...
目录用户用户管理查询所有用户查看当前用户查看当前连接数创...