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