Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中的UDF、触发器和IF/ELSE或CASE_Sql_Database_Postgresql_If Statement_Case Statement - Fatal编程技术网

PostgreSQL中的UDF、触发器和IF/ELSE或CASE

PostgreSQL中的UDF、触发器和IF/ELSE或CASE,sql,database,postgresql,if-statement,case-statement,Sql,Database,Postgresql,If Statement,Case Statement,我有一个游戏表,记录p1_id、p1_分数、p2_id、p2_分数和赢家id。我希望有一个触发器,它使用用户定义的函数自动填写赢家(作为使用两者的实践) 我有扳机: CREATE TRIGGER determine_winner BEFORE INSERT ON games FOR EACH ROW EXECUTE PROCEDURE calculate_winner(); 以及自由民主党: CREATE OR REPLACE FUNCTION calculate_winner() RET

我有一个游戏表,记录p1_id、p1_分数、p2_id、p2_分数和赢家id。我希望有一个触发器,它使用用户定义的函数自动填写赢家(作为使用两者的实践)

我有扳机:

CREATE TRIGGER determine_winner 
BEFORE INSERT ON games
FOR EACH ROW 
EXECUTE PROCEDURE calculate_winner();
以及自由民主党:

CREATE OR REPLACE FUNCTION calculate_winner()
RETURNS TRIGGER AS $d$
BEGIN
IF NEW.p1_score > NEW.p2_score THEN
  NEW.winner_id = NEW.p1_id;
END IF;

IF NEW.p1_score < NEW.p2_score THEN
  NEW.winner_id = NEW.p2_id;
END IF;

IF NEW.p1_score = NEW.p2_score THEN
 NEW.winner_id = 0;
END IF;

RETURN NEW;
END;
$d$ LANGUAGE plpgsql;
创建或替换函数calculate\u winner()
将触发器返回为$d$
开始
如果NEW.p1_分数>NEW.p2_分数,则
NEW.winner\u id=NEW.p1\u id;
如果结束;
如果NEW.p1\u得分
这非常有效,但我根本不喜欢使用三个IF语句,但无法使用CASE语句。许多示例似乎在不同版本的SQL中不起作用。有人能帮忙吗

谢谢

更新:作为参考,ELSIF也可以工作,如下所示:

IF NEW.p1_score > NEW.p2_score THEN
   NEW.winner_id = NEW.p1_id;
ELSIF NEW.p1_score < NEW.p2_score THEN
  NEW.winner_id = NEW.p2_id;
ELSE
 NEW.winner_id = 0;
END IF;
如果NEW.p1\u分数>NEW.p2\u分数,则
NEW.winner\u id=NEW.p1\u id;
ELSIF NEW.p1_得分
@NickBarnes谢谢!这么简单。我将更新为只要求一个工作案例语句:)有一个带有案例的函数。如果包含非工作示例,这会有所帮助。只是一个猜测,但您可能会将过程的语法与SQL混淆。@谢谢,这看起来像是一个惊人的资源,到目前为止,我的搜索中没有出现过@尼克巴恩斯,谢谢!这么简单。我将更新为只要求一个工作案例语句:)有一个带有案例的函数。如果包含非工作示例,这会有所帮助。只是一个猜测,但您可能会将过程的语法与SQL混淆。@谢谢,这看起来像是一个惊人的资源,到目前为止,我的搜索中没有出现过!