2017-06-21 46 views
1

我正在學習postgres的過程中,我已經找到了一個解決這個問題的方法,但是我想問社區如果這樣的事情甚至是可能的,也許我的語法剛剛關閉。Postgres如果變量

DO $$ BEGIN 
    IF :MODIFYBY IS NOT NULL THEN 
     UPDATE User SET ModifyBy = :MODIFYBY WHERE UserId = :USERID; 
     UPDATE Profile SET ModifyBy = :MODIFYBY WHERE UserId = :USERID; 
    END IF; 
END $$; 

達到或接近接收

語法錯誤 「:」

爲:MODIFYBY是這個SQL參數。

如何測試參數是否爲空?

注:運行PostgreSQL的9.6

更新:

有可能我的術語是不正確的。完整的sql語句是這樣的

BEGIN; 

    UPDATE User 
     SET Email = :EMAIL   
      ,ModifyDate = now() at time zone 'utc' 
    WHERE 
     UserId = :USERID; 

    UPDATE Profile 
     SET FirstName = :FIRSTNAME   
      ,LastName = :LASTNAME   
      ,ModifyDate = now() at time zone 'utc' 
    WHERE 
     UserId = :USERID; 

    DO $$ BEGIN 
     IF :MODIFYBY IS NOT NULL THEN 
      UPDATE User SET ModifyBy = :MODIFYBY WHERE UserId = :USERID; 
      UPDATE Profile SET ModifyBy = :MODIFYBY WHERE UserId = :USERID; 
     END IF; 
    END $$; 

COMMIT; 

我添加了DO $$ BEGIN和END $$;讓IF語句正常工作...

+0

一個函數的例子有在(純)無SQL IF。但是,您可以將條件添加到WHERE子句中。 – wildplasser

+0

其中是參數定義?我不知道你是否可以使用':'作爲參數名稱。 –

+0

@wildplasser在匿名塊中有IF。我想這個操作會混淆來自像jdbc這樣的驅動程序實現的參數。 –

回答

1

我覺得你的問題是在使用:參數的函數中沒有使用它。

這是使用IF

CREATE OR REPLACE FUNCTION traffic.check_distance(
    int_route_source_id bigint, 
    num_distance_geo numeric) 
RETURNS boolean AS 
$BODY$ 
DECLARE 
    bol_route_error boolean = false; 
    num_distance_rto numeric; 

BEGIN 

    -- CALCULATE ROUTE DISTANCE 
    SELECT INTO num_distance_rto 
    .... 

    --RAISE DISTANCE ALARM 
    IF num_distance_rto > 3.5 * num_distance_geo THEN 
     UPDATE traffic.Route_Sources   
     SET 
      IsValid = FALSE, 
      result = '3.5x MUY LARGO' 
     WHERE 
      route_source_id = int_route_source_id; 
     bol_route_error = true; 
    END IF; 

    RETURN bol_route_error; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION traffic.check_distance(bigint, numeric) 
    OWNER TO postgres; 
+0

我認爲如果我的參數是:EMAIL,:USERID,:FIRSTNAME,:LASTNAME,:MODIFYBY,那麼這裏發生的事情是我的匿名函數沒有看到或無法從邊界外取參數 – Layser