PostgreSQL中的UDF、触发器和IF/ELSE或CASE
我有一个游戏表,记录p1_id、p1_分数、p2_id、p2_分数和赢家id。我希望有一个触发器,它使用用户定义的函数自动填写赢家(作为使用两者的实践) 我有扳机: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
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混淆。@谢谢,这看起来像是一个惊人的资源,到目前为止,我的搜索中没有出现过!