相关疑难解决方法(0)

如何使用新的PostgreSQL JSON数据类型中的字段进行查询?

我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例.

具体来说,给定一系列JSON记录:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]
Run Code Online (Sandbox Code Playgroud)

如何编写SQL以按名称查找记录?

在vanilla SQL中:

SELECT * from json_data WHERE "name" = "Toby"
Run Code Online (Sandbox Code Playgroud)

官方开发手册非常稀少:

更新我

我已经汇总了详细介绍PostgreSQL 9.2目前可能实现的内容.使用一些自定义函数,可以执行以下操作:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
Run Code Online (Sandbox Code Playgroud)

更新II

我现在已将我的JSON函数移动到他们自己的项目中:

PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数

sql postgresql json postgresql-9.2 postgresql-9.3

208
推荐指数
3
解决办法
18万
查看次数

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

CREATE TABLE tracks (id SERIAL, artists JSON);

INSERT INTO tracks (id, artists) 
  VALUES (1, '[{"name": "blink-182"}]');

INSERT INTO tracks (id, artists) 
  VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)

还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.

我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.

我正在使用此查询:

SELECT * FROM tracks 
  WHERE 'ARTIST NAME' IN
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

例如

SELECT * FROM tracks
  WHERE 'The Dirty Heads' IN 
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

74
推荐指数
1
解决办法
5万
查看次数

jsonb查询与数组中的嵌套对象

我正在使用PostgreSQL 9.4,其中teams包含一个jsonb名为的列的表json.我正在寻找一个查询,我可以让所有拥有球员的球队3,4以及7他们的球员阵容.

该表包含两行,包含以下json数据:

第一排:

{
    "id": 1,
    "name": "foobar",
    "members": {
        "coach": {
            "id": 1,
            "name": "A dude"
        },
        "players": [
            {
                "id": 2,
                "name": "B dude"
            },
            {
                "id": 3,
                "name": "C dude"
            },
            {
                "id": 4,
                "name": "D dude"
            },
            {
                "id": 6,
                "name": "F dude"
            },
            {
                "id": 7,
                "name": "G dude"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

第二排:

{
    "id": 2,
    "name": "bazbar",
    "members": …
Run Code Online (Sandbox Code Playgroud)

sql postgresql relational-division jsonb postgresql-9.4

9
推荐指数
1
解决办法
4092
查看次数

在 JSON 数组中搜索包含与模式匹配的值的对象

我有一个带有一jsonb列的数据库,其中每一行本质上都包含一个名称值对数组。单个jsonb值的示例:

[
    {"name":"foo", "value":"bar"},
    {"name":"biz", "value":"baz"},
    {"name":"beep", "value":"boop"}
]
Run Code Online (Sandbox Code Playgroud)

如何查询包含部分值的行?即,查找具有 JSON 对象键value(如“%ba%”)的行?

我知道我可以用来SELECT * FROM tbl WHERE jsoncol @> '[{"value":"bar"}]'查找 JSON 是该特定值的行,但是我将如何查询包含模式的行?

sql postgresql json pattern-matching

5
推荐指数
1
解决办法
4544
查看次数

使用数组参数多次调用设置返回函数

这是plpgsql 函数的一个变体,它返回多个列,并被多次调用。然而,我希望找到针对我的特殊情况的解决方案。

我有一个函数,它处理具有给定参数的行数组,并返回一组行+一个新列。

CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...
Run Code Online (Sandbox Code Playgroud)

该函数适用于只有一组数据的测试用例

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 
Run Code Online (Sandbox Code Playgroud)

但我想让它处理多组数据,而不将 a 传递dataid给函数。我尝试了多种变体:

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid
Run Code Online (Sandbox Code Playgroud)

但该函数会为每一列调用一次。

sql postgresql join plpgsql set-returning-functions

1
推荐指数
1
解决办法
4529
查看次数