我有一个 JSON 包含查询,如下所示。该查询在数组中查找匹配的对象。这行得通。
Name 和 DataType 的值将被传递给一个 .Net 函数,并在 NpgSql 中构建查询。我想参数化值(城市,字符串)以避免 SQL 注入。如何做到这一点?
根据这个 GitHub 问题,我尝试使用 jsonb_build_object 构建 json,但我需要构建对象数组。我被告知不能在 WHERE 中使用聚合函数,所以这不起作用。
那么,我可以构建一个对象数组来添加参数值,还是有更好的方法来避免这个查询中的 SQL 注入?
我们目前正在使用 Postgres 10.18,因此理想情况下该解决方案应该可以使用。但是,我们将很快升级到 14,因此对于 14 的更好解决方案也将引起人们的兴趣。
SELECT name FROM (SELECT name, fields -> 'dimensions' as dimensions
from data) x
WHERE dimensions @> '[{"Name": "city"}, {"DataType": "string"}]'
您可以在不使用聚合的情况下构建 JSON 数组和对象,只要它们的大小是固定的:
但也许你应该使用一些 C++ 库来构建 JSON 并将它传递给 PostgreSQL。如果您不想在客户端处理 JSON,那么您可能也不应该在数据库端使用它。