PostgreSQL查询,当参数为null/空时返回所有值

ni65a41a  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(265)

我有一个非常简单的查询,它需要一个字符串数组参数。当参数有值时没有问题,但是当参数为空时我需要返回所有值。

select distinct departamento_nom
from dim_publicas.dt_cliente dc
where departamento_nom in (${dpto})

字符串
我已经尝试过coalesce参数,但是当不为null时,它只接受字符串数组的第一个值

select distinct departamento_nom
from dim_publicas.dt_cliente dc
where departamento_nom in (coalesce (${dpto},departamento_nom))


的数据

rsaldnfx

rsaldnfx1#

当遇到${dpto}时,客户端应用程序似乎正在执行字符串替换,并将结果文本作为查询提交。这是一种危险的做法,因为它会使查询容易受到SQL注入攻击。较好的做法是使用绑定参数。
以下查询保留了具有风险的字符串替换方法。如果${dpto}的计算结果为空字符串,则它将返回所有不同的行。如果${dpto}的计算结果为逗号分隔的带引号值列表,则查询将返回与列表中的任何值匹配的所有非重复行。

SELECT DISTINCT dc.departamento_nom
  FROM dim_publicas.dt_cliente dc
  CROSS JOIN (SELECT ARRAY[${dpto}]::text[] AS dpto) t
 WHERE cardinality(t.dpto) = 0 OR dc.departamento_nom = ANY(t.dpto);

字符串
该查询的工作原理是将${dpto}转换为字符串数组,该数组将作为单行表t中的列dpto返回。这一行与dim_publicas.dt_cliente的每一行联接。

相关问题