Postgresql

從表列評估比較運算符

  • December 26, 2021

是否可以將欄位值擴展為比較運算符?像這樣的東西:

create table math (
   value1 int,
   value2 int,
   operator text
);
insert into math values(1,2,'>=');

select * from math where value1 operator value2;

PS:我知道可以通過 解決這個案例case when,但想知道是否有替代解決方案。

的,可能。您需要動態 SQL 來評估表達式。

不安全

一種簡單、幼稚的方法。比安全方法更簡單、更快。

CREATE OR REPLACE FUNCTION eval_unsafe(_operand1 int, _operand2 int, _operator text, OUT _result bool)
 LANGUAGE plpgsql AS
$func$
BEGIN
  EXECUTE format('SELECT $1 %s $2', _operator)
  USING _operand1, _operand2
  INTO  _result;
END
$func$;

這對SQL 注入開放。如果您的表源是安全的,那就足夠了。但是,表源是否安全?

安全的

我建議使用這種安全的方法:

CREATE OR REPLACE FUNCTION eval_safe(_operand1 int, _operand2 int, _operator text, OUT _result bool)
 LANGUAGE plpgsql AS
$func$
BEGIN
  EXECUTE format('SELECT $1 OPERATOR (%s) $2', (_operator || '(integer, integer)')::regoperator::regoper)
  USING _operand1, _operand2
  INTO  _result;
END
$func$;

打電話給你的例子:

SELECT *
FROM   math m
WHERE  eval_safe(m.value1, m.value2, m.operator);

db<>在這裡擺弄

轉換為對象標識符類型pg_operator強制執行有效的運算符(有效地檢查系統目錄中的有效條目pg_operator)。下一次強制轉換pg_oper只是為OPERATOR構造獲取有效格式的便捷方式。

看:

引用自:https://dba.stackexchange.com/questions/305382