Postgresql
從表列評估比較運算符
是否可以將欄位值擴展為比較運算符?像這樣的東西:
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
構造獲取有效格式的便捷方式。看: