これはうまくいきます。@unit_type 変数を変更した場合。計算で正しいユニットタイプが出てきます。
set @unit_type = 'kilometers';
set @lat = 50;
set @lon = 100;
set @lat2 = 51;
set @lon2 = 101;
select
(CASE @unit_type
WHEN 'feet' THEN 20000000
WHEN 'miles' THEN 3696.1
WHEN 'meters' THEN 6979100
WHEN 'kilometers' THEN 6979
END
* acos( cos( radians(@lat) )
* cos( radians( @lat2 ) )
* cos( radians( @lon2 )
- radians(@lon) )
+ sin( radians(@lat) )
* sin( radians( @lat2 ) )
) ) AS distance;
ただし、そうではありません。このストアド プロシージャを実行しようとすると、毎回キロメートル単位で返されます。キロメートルのケースを削除すると、結果は null になります。
CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select
(CASE @unit_type
WHEN 'feet' THEN 20000000
WHEN 'miles' THEN 3696.1
WHEN 'meters' THEN 6979100
WHEN 'kilometers' THEN 6979
END
* acos( cos( radians(@lat) )
* cos( radians( @lat2 ) )
* cos( radians( @lon2 )
- radians(@lon) )
+ sin( radians(@lat) )
* sin( radians( @lat2 ) )
) ) AS distance;
END
これがなぜなのか、そしてこの問題を回避するためにこれをどのように書くのが良いのかを理解したいだけです。
誰にもアイデアはありますか?前もって感謝します。
更新しました:
解決策は、プロシージャの SELECT ステートメント内から @ を削除することでした。パラメータにアクセスする必要がないためです。
CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select
(CASE unit_type
WHEN 'feet' THEN 20000000
WHEN 'miles' THEN 3696.1
WHEN 'meters' THEN 6979100
WHEN 'kilometers' THEN 6979
END
* acos( cos( radians(lat) )
* cos( radians( lat2 ) )
* cos( radians( lon2 )
- radians(lon) )
+ sin( radians(lat) )
* sin( radians( lat2 ) )
) ) AS distance;
END