2017-10-25 17 views
0

"ユーザー"と呼ばれるテーブル内の行が更新された後に起動するトリガーを作成しています。ユーザーの "lat"と "lng"列が別の緯度から指定された距離内にある場合はpg_notifyにします。& lng値。私はすでにこのようになり、所与の緯度と経度の値の特定の距離内のすべてのユーザーを選択するWHERE句を使用してSQLクエリを作成した:句のみ緯度を持っており、ユーザが選択PostgreSQLストアドプロシージャのIF句でWHERE句を実行できますか?

SELECT * 
FROM users 
WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng); 

ザ緯度経度の$3メートル以内の経度($1, $2)

CREATE OR REPLACE FUNCTION notify_on_user_location_update(channel text, specified_lat numeric, specific_lng numeric) RETURNS trigger AS $$ 
DECLARE 
    changed_lat numeric; 
    changed_lng numeric; 
    specified_radius numeric := 5000; 
BEGIN 
    IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN 
    changed_lat = NEW.lat; 
    changed_lng = NEW.lng; 
    ELSE 
    changed_lat = OLD.lat; 
    changed_lng = OLD.lng; 
    END IF; 

IF earth_box(ll_to_earth(specified_lat, specified_lng), specified_radius) @> ll_to_earth(changed_lat, changed_lng) 
    PERFORM pg_notify(// notification specification here); 
ENDIF 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

:今、私は変更され、ユーザーの緯度とLNGポイントが指定された緯度とLNGポイントの指定された半径内にある場合、通知を発射すなわち、これは、where句を使用するように見えますストアドプロシージャを作成したいですしかし、これは本質的にちょうど擬似コードのようには機能しません。何とかこれを起こすことができますか?

答えて

1

IFは条件であり、PLでは選択可能な値を選択する必要があります。 THEN句とEND IF;

が必要です。この例では、許容できる条件がなく、THEN句がありません。

IF 
    (SELECT count(*) 
    FROM users 
    WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng))>0 
THEN 
    PERFORM pg_notify(// notification specification here); 
END IF; 
:また、ENDIFは、あなたがこのような何かを行うことができ、スペースと ;

であるしかし、