0

これはうまくいきます。@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
4

1 に答える 1