相关疑难解决方法(0)

用于在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万
查看次数

在Postgres jsonb中查询数组结构的正确索引是什么?

我正在试验jsonb在Postgres 9.4 中的Postgres 字段中保留以下值:

[{"event_slug":"test_1","start_time":"2014-10-08","end_time":"2014-10-12"},
 {"event_slug":"test_2","start_time":"2013-06-24","end_time":"2013-07-02"},
 {"event_slug":"test_3","start_time":"2014-03-26","end_time":"2014-03-30"}]
Run Code Online (Sandbox Code Playgroud)

我正在执行以下查询:

SELECT * FROM locations
WHERE EXISTS (
  SELECT 1 FROM jsonb_array_elements(events) AS e
  WHERE (
    e->>'event_slug' = 'test_1' AND
    (
      e->>'start_time' >= '2014-10-30 14:04:06 -0400' OR
      e->>'end_time' >= '2014-10-30 14:04:06 -0400'
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

如何利用上述查询为该数据创建索引?这对于几百万行来说听起来是否合理?每行包含〜10个事件?

值得注意的是,我似乎仍在进行顺序扫描:

CREATE INDEX events_gin_idx ON some_table USING GIN (events);
Run Code Online (Sandbox Code Playgroud)

我猜是因为我在查询中做的第一件事就是将数据转换为json数组元素.

sql postgresql indexing set-returning-functions jsonb

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

使用PL / pgSQL检查密钥是否存在于JSON中?

我正在尝试检查在PL / pgSQL函数中作为参数发送的JSON中是否存在密钥。

这是功能。

CREATE FUNCTION sp_update_user(user_info json) RETURNS json
    LANGUAGE plpgsql
    AS $$
    BEGIN
    PERFORM user_info->>'lastname';
    IF FOUND
    THEN
      UPDATE users SET lastname = user_info->>'lastname' WHERE id = sp_update_user.user_id;
    END IF;

    PERFORM user_info->>'firstname';
    IF FOUND
    THEN
      UPDATE users SET firstname = user_info->>'firstname' WHERE id = sp_update_user.user_id;
    END IF;

    RETURN row_to_json(row) FROM (SELECT true AS success) row;
END;$$;
Run Code Online (Sandbox Code Playgroud)

我尝试使用PERFORM-clause,但是即使json键不存在,该IF FOUND子句中的语句也会执行。

我试图PERFORM user_info->>'firstname' INTO myvar;检查变量内容,但会触发错误ERROR: query "SELECT user_info->>'firstname' INTO myvar" is not a SELECT …

postgresql json plpgsql postgresql-9.3

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

在PostgreSQL中使用json数组中的索引

参考原始的stackoverflow问题,我试图将金币索引应用于Postgres 9.4中数组对象中的键,但我没有得到第一个答案中所述的结果.

你能否解决这个错误?

我遵循的步骤如下.

第1部分:创建表和索引

CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
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)

第2部分:查询

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)
Run Code Online (Sandbox Code Playgroud)

此查询提供空结果.
我也尝试使用jsonb_path_opsGIN索引.

替代索引和查询:

DROP INDEX tracks_artists_gin_idx;
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING  gin (artists jsonb_path_ops); …
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql indexing jsonb

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

PostgreSQL:将数组传递给过程时出现问题

我的类型为:

CREATE TYPE status_record AS
   (
   id bigint,
   status boolean
   );
Run Code Online (Sandbox Code Playgroud)

使用类型数组作为输入参数进行某些处理的过程,如下所示:

CREATE OR REPLACE FUNCTION update_status(status_list status_record[])
RETURNS text AS
$BODY$
DECLARE  

BEGIN    
--does some processing
return 'SUCCESS'; 

end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

最后我查询程序为:

select *
from update_status(cast(ARRAY[(385,false),(387,false)] as status_record[]));
Run Code Online (Sandbox Code Playgroud)

在 pgadmin 中一切正常。后来,当我尝试使用Hibernate 本机 SQL 查询调用相同的命令时,Ka Boom!!!显示如下:

 org.postgresql.util.PSQLException:
 ERROR: array value must start with "{" or dimension information 
Run Code Online (Sandbox Code Playgroud)

最后一个问题:两者ARRAY[--something]{--something}作用相同吗?

java postgresql stored-procedures hibernate

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