我有一个plpgsql函数complementwhere(parameter1 date)
,它返回一个复杂的where子句作为文本,让我们说它返回clause2 = filter2
只是作为一个例子,但它实际上返回一堆其他子句。
我需要在select的where子句中调用这个函数来补充那个子句,这是我目前所拥有的:
SELECT value1 FROM table1 WHERE clause1 = filter1 AND complementwhere(parameter1);
但是这会返回错误
WHERE的参数必须是布尔类型,而不是text类型
正确的方法是什么?
您正在尝试将文本值转换为代码,这在SQL中通常是不可能的。您需要到服务器进行两次往返。
- 取回
WHERE
子句:SELECT complementwhere('<mydate>')
. - 基于第一个查询构建查询并执行:
SELECT .. WHERE ...
。
或(最好)在单个PL/pgSQL函数中与 EXECUTE
一起使用动态SQL。这里有很多关于SO的例子,试着搜索一下。
你没有提供你的实际代码…
当您将用户输入转换为代码时,请注意SQL注入