【问题标题】:Simplify PostgreSQL function简化 PostgreSQL 函数
【发布时间】:2014-09-25 14:05:32
【问题描述】:

我有一个包含以下代码的 PostgreSQL 存储过程:

IF something = TRUE THEN
    SELECT id INTO some_id FROM some_table WHERE some conditions LIMIT 1;
    RETURN QUERY SELECT * FROM some_table WHERE some conditions LIMIT 1;
ELSE
    SELECT id INTO some_id FROM some_table WHERE some OTHER conditions LIMIT 1;
    RETURN QUERY SELECT * FROM some_table WHERE some OTHER conditions LIMIT 1;
END IF;

DELETE FROM some_table where id = some_id;

有没有办法简化上面的代码?我想我们无能为力 关于IFELSE中的重复代码,但是有没有办法避免 每次都有 2 个SELECT?是否可以在some_id 中插入一些东西而 RETURN QUERY?

【问题讨论】:

  • 您可以在较新的版本中使用RETURN QUERY EXECUTE ...,并使用使用format 和字符串连接创建的动态SQL 字符串来执行此操作。
  • 你的DELETE 语句永远不会被执行,因为你的两个IF 分支都有一个RETURN 语句。
  • @pozs: 否。RETURN QUERY 不会退出函数(与 RETURN 不同)。
  • @CraigRinger:这里不需要EXECUTE。没有什么动态的,只有两种情况。
  • @ErwinBrandstetter 当然,我的错。那只是愚蠢的语法高亮,不强调QUERY——RETURN QUERY真的不退出。

标签: sql postgresql stored-procedures plpgsql sql-delete


【解决方案1】:

如果该功能仅执行您发布的功能,则没有必要:

delete from some_table
where 
    something and (some conditions)
    or
    something is not true and (some other conditions)
returning *

【讨论】:

  • 错过了something IS NULL 案例。如果某些内容可以为 NULL,则使用 or something IS NOT TRUE 对第二个表达式执行与上面的 IF 语句相同的操作(或者 OP 需要重新检查对 TRUE / FALSE / NULL 执行什么操作)。
猜你喜欢
  • 2017-04-14
  • 2013-01-11
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2014-07-06
  • 2021-12-17
相关资源
最近更新 更多