【问题标题】:Postgres rule to substitute word in WHERE clausePostgres 规则替换 WHERE 子句中的单词
【发布时间】:2016-08-25 09:15:06
【问题描述】:

是否可以用规则 (CREATE RULE myrule AS ON SELECT TO mytable...) 替换 SELECT 语句的 WHERE 子句中的单词?

SELECT col1, col2
FROM mytable
WHERE col2 = 1;

应该变成

SELECT col1, col2
FROM mytable
WHERE col3 = 1;

初始语句由不允许替换的客户端发出。因此,替换必须在数据库端完成。

** 编辑**

我可能不够具体。 我需要一个列名替换这种选择语句的模式。 WHERE 子句不断变化。以及 是否可以在规则本身中引用当前的 SELECT 语句?

分解到最低限度这是我需要的:

  • 获取当前的 SELECT 语句(如果它具有这种特定模式)
  • 将“WHERE col2”替换为“WHERE col3”
  • 打包成一个可以部署在数据库端的规则

【问题讨论】:

  • 您可以使 SQL 动态化,在其中传递所有三个参数(而不是文字),然后对其进行处理,以便当它获得一个空白参数时它变为 true...例如 where (col1 = ? or ? is null) and (col2 = ? or ? is null)
  • 不,这是不可能的。如果您可以设置规则,则查询将返回 col1, col3 而不是 col1, col2
  • 这就是为什么我的示例中的替换包含 WHERE 以确保仅替换 WHERE 子句中的表名

标签: postgresql select substitution rules


【解决方案1】:

使用case when 声明

SELECT col1, col2, col3
FROM mytable
WHERE CASE WHEN foo='bar' THEN col3 ELSE col1 END = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2017-07-11
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多