gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:56:26 25 4
gpt4 key购买 nike

我有一个目前在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com