MySQL存储函数,如果。。。如果结束,语法错误,请在“”附近使用正确的语法

MySQL存储函数,如果。。。如果结束,语法错误,请在“”附近使用正确的语法,mysql,mysql-error-1064,stored-functions,create-function,Mysql,Mysql Error 1064,Stored Functions,Create Function,我目前在PHP中使用了一个函数,它从不同的字段编译邮件地址,但考虑到不同地区使用的不同格式。我试图将其复制为MySQL存储函数。我意识到,在代码中执行此类操作通常比在数据库中更快,但我们的内部网提供了一种方式,让人们以只读方式输入原始的MySQL SELECT命令,以便构建高级搜索并保存查询。将使用此特定功能,以便用户可以将其高级搜索查询结果输出到标签布局 当我尝试使用phpMyAdmin 3.4.9 Last stable存储函数时,出现以下错误: #1064 - You have an er

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

当我尝试使用phpMyAdmin 3.4.9 Last stable存储函数时,出现以下错误:

#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行接近IF、RETURN和END子句的末尾,但我看不出有什么错误

有人能在MySQL Workbench和phpMyAdmin中看到导致此问题的原因吗? 一旦我存储了这个函数,我就可以测试它并调整逻辑

另外,如果函数中有任何东西可以简化,请告诉我。这里没有太多的例子,所以我把它拼凑起来。

如果;-将最后几行更改为:

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;
END IF;

RETURN address;
END;;

好的,我来回答我自己的问题。多亏了Yahia,我又看了一眼我的IF语句语法。 结果是我把问题搞砸了

上面还有两个IF子句。 正确的语法实际上是ELSEIF 我只是假设,因为END IF,它也应该是ELSE IF,如果有一个空格,实际上没有从文档中确定

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

一旦你纠正了ELSE if,上面的查询在phpMyAdmin中就可以完美地工作,但是我对逻辑做了一些调整


所以我所有的过错和RTM

其他解决方案。尝试以下功能:

DROP FUNCTION IF EXISTS test;

DELIMITER $$
CREATE FUNCTION test(name VARCHAR(255), id INT) RETURNS INT
BEGIN
    DECLARE var_resp INT DEFAULT 0;

    IF (LENGTH(TRIM(name)) > 0) THEN
        UPDATE mytableset IDName= name WHERE mytable.ID = id
        SET var_resp = 1;
    END IF;

    RETURN var_resp;

END $$
DELIMITER ;

问候。

@batfastad,如果结束;也许不是唯一缺少的东西。。。但我没有安装MySQL来检查它……公平地说,我会快速检查我的嵌套是否匹配。干杯:我感到非常羞愧,我必须看到这个答案才能注意到我的错误