【问题标题】:Multiple key/value pairs in JSON field as query paramJSON字段中的多个键/值对作为查询参数
【发布时间】:2021-08-09 20:43:43
【问题描述】:

我有一个包含以下记录的 Postgresql 表(为您提供方便的 json):

[
    {
        "field": "example1",
        "jsonfield": {"name": "name1", "option": "option1}
    },
    {
        "field": "example2",
        "jsonfield": {"name": "name2", "option": "option2}
    },
    {
        "field": "example3",
        "jsonfield": {"name": "name3", "option": "option3}
    }
]

现在我有多个合适的键/值对列表可供从该表中选择

SELECT 
    field, jsonfield
FROM table
WHERE jsonfield @> ANY (ARRAY['{"name": "name1", "option": "option1}', '{"name": "name3", "option": "option3}']::jsonb[])

效果很好,返回第一条和第三条记录

但是,我想将数组作为查询参数传递

SELECT 
    field, jsonfield
FROM table
WHERE jsonfield @> ANY (ARRAY[(:search_data)]::jsonb[])

这会引发以下错误:

Query 1 ERROR: ERROR: cannot cast type record to jsonb

如何将数组作为查询参数传递?
我应该使用类似 string_to_array 的东西吗?

我使用 PostgreSQL 13.3

【问题讨论】:

  • 如果我不使用ARRAY,我会收到"[" must introduce explicitly-specified array dimensions.
  • 要回答这部分How do I pass the array as a query param?,我们需要知道您使用的是什么语言甚至框架。

标签: postgresql


【解决方案1】:

正确的语法应该是(取决于语言)

... WHERE jsonfield @> ANY (cast(:search_data as jsonb[]))

您必须将 search_data 参数作为数组发送(很大程度上取决于语言、库和支持的内容)或数组字符串语法。数组字符串语法如下:

左大括号{} 闭合。

元素列表对几乎所有值类型都使用分隔符,。我相信使用另一个分隔符的是空间/几何类型。

如果每个元素是字符串或可表示字符串的元素,则必须在其包含时用引号引起来:

  1. 双引号
  2. 分隔符
  3. 左大括号或右大括号
  4. 它是一个由"null" 组成的字符串。不区分大小写。

转义字符串中的双引号是用反斜杠完成的。

使用双引号引用字符串和字符串表示形式。

例子:

  1. ARRAY[DATE '2020-06-01', DATE '2021-06-01'] 变为 {2020-06-01,2021-06-01}
  2. 包含please, don'tinclude 的数组变为{"please, don't",include}{"please, don't","include"}
  3. 包含He said "don't do it" 的数组将变为{"He said \"don't do it\""}

Sample with raw queries

【讨论】:

  • 目前唯一使用逗号以外的分隔符的类型是几何框。它是 pg_type.dat 中唯一一个具有非默认 typdelim 值的。
猜你喜欢
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多