gpt4 book ai didi

用于纬度经度语法的 MySQL 用户定义函数

转载 作者:可可西里 更新时间:2023-11-01 08:08:12 24 4
gpt4 key购买 nike

我创建了一个 MySQL 函数来确定一组经纬度坐标是否在另一组经纬度坐标的特定范围内。但是,该函数给我一个语法错误,所以我无法测试它是否正常工作。任何帮助找出导致错误的原因将不胜感激。该函数及其描述如下:

它的工作原理是将起始纬度/经度坐标传递给函数。数据库包含行 targa、targb 和 targc,它们分别包含要比较的纬度、经度和范围。数据库中的 targ 列指定是否应检查此行的纬度/经度范围。

CREATE FUNCTION inrange(
lat1 decimal(11, 7),
lon1 decimal(11, 7))
READS SQL DATA
RETURNS INT(1)
BEGIN
DECLARE distance decimal(18, 10);

SET distance = ACOS(SIN(lat1)*SIN(targ2)+COS(lat1)*COS(targ2)*COS(targ3-lon1))*6371;

IF distance <= targ4 THEN
RETURN 1;
END IF;

RETURN 0;
END$$

mysql给我的错误是:

1064 - 你的 SQL 语法有错误;查看与您的 MySQL 服务器版本对应的手册,了解在“READS SQL DATA”附近使用的正确语法 返回整数 (1)开始 在第 4 行声明 distance decimal(18, 10)'

我似乎无法弄清楚如何克服这个错误。

此外,如果有人来此帖子寻找这样的 mysql 函数,我还有另一篇相关帖子:

MySQL Function to Determine Zip Code Proximity / Range

我非常感谢另一位发帖人的功能(它是这篇发帖人的灵感),但我需要更紧凑的内容。因此,有问题的功能。

编辑:以下代码有效且有效。请记住将分隔符设置为 $$。再次感谢大家的帮助。

工作代码:

CREATE FUNCTION inrange(
lat1 decimal(11, 7),
long1 decimal(11, 7),
lat2 decimal(11, 7),
long2 decimal(11, 7),
rng decimal(18, 10))
RETURNS INT(1)
BEGIN
DECLARE distance decimal(18, 10);

SET lat1 = lat1 * PI() / 180.0,
long1 = long1 * PI() / 180.0,
lat2 = lat2 * PI() / 180.0,
long2 = long2 * PI() / 180.0;

SET distance = ACOS(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(long2-long1))*6371;

IF distance <= rng THEN
RETURN 1;
END IF;

RETURN 0;
END$$

最佳答案

您的 RETURNS 和 READS SQL DATA 乱序了。返回优先:

CREATE FUNCTION inrange(
lat1 decimal(11, 7),
lon1 decimal(11, 7))
RETURNS INT(1)
READS SQL DATA
BEGIN

编辑:此外,正如您在评论中所说,您指的是数据库中的列。您的函数不仅不知道这些列属于哪个表,而且通常您不应该从函数内部引用列。相反,向您的函数添加参数:

CREATE FUNCTION inrange(
lat1 decimal(11, 7),
long1 decimal(11, 7),
lat2 decimal(11, 7),
long2 decimal(11, 7),
rng decimal(18, 10))
RETURNS INT(1)
BEGIN
DECLARE distance decimal(18, 10);

SET distance = ACOS(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(long2-long1))*6371;

IF distance <= rng THEN
RETURN 1;
END IF;

RETURN 0;
END$$

然后,在您的查询中,您可以将列名传递给函数。

(免责声明:确保我将经纬度放在正确的位置。我想我做到了。)

关于用于纬度经度语法的 MySQL 用户定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640448/

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