7

我有一个我目前在 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`, 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 中看到导致此问题的原因?
一旦我存储了函数,我就可以对其进行测试并调整逻辑。

另外,如果函数中有任何可以简化的内容,请告诉我。那里没有很多例子,所以我已经把它拼凑在一起了。

4

3 回答 3

9

好的,我将回答我自己的问题。感谢 Yahia,我再次查看了我的 IF 语句语法。
原来我搞砸了查询!

ELSE IF上面有2个子句。
根据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

于 2012-01-28T23:30:43.267 回答
5

其他解决方案。尝试一个函数:

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 ;

问候。

于 2012-12-09T20:39:18.663 回答
3

你错过了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;
END IF;

RETURN address;
END;;
于 2012-01-28T22:03:27.447 回答