标签: array

用于在 JSON 数组中查找属性组合的索引

基于这个关于 SO 的相关问题

如果您只想要简单的匹配,这很好用。假设在 JSON 数据中tracks同时具有ArtistTitle字段。所以我们有类似的东西:

INSERT INTO tracks (id, data)
VALUES (1, '[{"artist": "Simple Plan", "title": "Welcome to My Life"}]');
Run Code Online (Sandbox Code Playgroud)

我们像在原始问题中一样创建索引:

CREATE INDEX tracks_artists_gin_idx ON tracks
USING GIN (json2arr(data, 'artist'));

CREATE INDEX tracks_title_gin_idx ON tracks
USING GIN (json2arr(data, 'title'));
Run Code Online (Sandbox Code Playgroud)

所以现在我们有两个字段要匹配。如您所见,如果我们执行以下原始查询(经过非常简单的修改):

SELECT *
FROM   tracks
WHERE  '{"ARTIST NAME"}'::text[] <@ (json2arr(data, 'artist'))
AND    '{"TITLE"}'::text[]       <@ (json2arr(data, 'title'))
Run Code Online (Sandbox Code Playgroud)

这将给出错误的答案,因为 JSON 数组中的艺术家和标题数组的索引不必匹配此查询以匹配 JSON 中的某些内容。执行此查询的正确方法是什么,以便我们可以获得所需的精确匹配?是否json2arr()需要改变?

编辑:为什么这是错误的

假设我们的表有如下记录:

INSERT INTO tracks (id, data) …
Run Code Online (Sandbox Code Playgroud)

postgresql index array json

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

在 PostgreSQL 9.4 中推送或附加到 JSON 数组

我有一个表,其中一个字段是 JSON 数组。我需要将接收到的 JSON 数组附加到该字段中而不覆盖现有值。

类似的东西:

CREATE OR REPLACE FUNCTION add_array(
    array_received json[])
  RETURNS void AS
$BODY$

    update table set _array_field = _array_field | array_received ...;

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

postgresql array json postgresql-9.4

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

在 JSONB 记录数组中查找包含键的行

我正在尝试查询对象数组中存在的键。这种结构:

column jdata
{"name": "Somedata",
 "array": [ {"name":"bla1", "attr": "somevalue"}, 
            {"name":"bla2", "otherdata": "somevalue2"},
            {"name":"bla3", "otherdata": "somevalue"}
           ],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)

现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。

我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。

我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?

目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。

请给我指明一个方向。

postgresql index array json json-path

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

通过基于传入的数组进行过滤,允许来自 plpgsql 函数的动态结果集?

我想我已经避免了这里的 XY 问题,因为我正在为真正的潜在问题(以动态方式总结多个表)列出我的解决方案,而且我只询问我卡住的最后一个部分。因此,首先有一些背景知识。我提供了一个最小的示例数据集,以及用于以我描述的方式汇总数据的工作代码。


考虑如下设置:

create temp table tbl1 (id int primary key, category text, passing boolean);

insert into tbl1 values
(1, 'A', 't'),
(2, 'A', 't'),
(3, 'A', 't'),
(4, 'A', 'f'),
(5, 'B', 't'),
(6, 'B', 'f'),
(7, 'C', 't'),
(8, 'C', 't'),
(9, 'C', 'f'),
(10, 'C', 'f'),
(11, 'C', 'f'),
(12, 'C', 'f'),
(13, 'B', 't'),
(14, 'B', 'f'),
(15, 'B', 't'),
(16, 'B', 'f'),
(17, 'B', 't'),
(18, 'B', 'f'),
(19, 'B', 't'),
(20, …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate plpgsql array postgresql-10

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

数组中的 mongodb distinct()

In my mongodb database,there is only one document below:
  {
      "_id" : ObjectId("5226efc5ccf23796f9590f67"),
      "count" : NumberLong(126045),
      "eissn" : "1466-5034",
      "grade" : 0.0,
      "issn" : "1466-5026",
      "journalAlias" : ["International journal of systematic and evolutionary microbiology", "Int J Syst Evol Microbiol", "Int. J. Syst. Evol. Microbiol."],
      "journalName" : "International journal of systematic and evolutionary microbiology",
      "ccNameCount" : [{
          "ccName" : "ATCC",
          "paperCount" : 1,
          "strainCount" : 2
        }, {
          "ccName" : "ATCC",
          "paperCount" : 3,
          "strainCount" : 4
        }, {
          "ccName" : …
Run Code Online (Sandbox Code Playgroud)

mongodb array

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

连接后保留数组元素的顺序

我有一个返回 CTE 的查询,如下所示

+-----------+-------------+
|   node_id | ancestors   |
|-----------+-------------|
|         1 | []          |
|         2 | []          |
|         3 | [1]         |
|         4 | [2]         |
|         5 | [4, 2]      |
+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

我想要做的是加入表nodes并将该列中的 id 替换ancestors为表中的另一列nodes。这是我到目前为止的查询:

WITH RECURSIVE tree AS (
  -- snip --
)
SELECT node.entity_id AS id,
       array_remove(array_agg(parent_nodes.entity_id), NULL) AS ancestors
FROM tree
JOIN entity.nodes AS node ON node.id = tree.node_id
LEFT OUTER JOIN entity.nodes AS parent_nodes ON …
Run Code Online (Sandbox Code Playgroud)

postgresql cte array recursive

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

PostgreSql:展平 json 数组数据

从我当前的查询中,我获得了这个 jsonb 数据:

values: "a1", ["b1", "b2"]
Run Code Online (Sandbox Code Playgroud)

我只想将它压平在一个级别上,如下所示:

values: "a1", "b1", "b2"
Run Code Online (Sandbox Code Playgroud)

这是在查询中获取数据的简化方法(只有 2 个级别是可能的,永远不会更多):

SELECT * 
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)

我尝试使用 jsonb_array_elements 但我的问题是:我不知道它是否是一个 json 数组!不是 SQL 专家,我没有找到一种方法来编写类似的代码:

SELECT
    IF (is_json_array(list)) 
        jsonb_array_elements(list)
    ELSE
        list
    ENDIF
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)

对于我当前数据的“缩小”视图,这是一个无表工作测试:

with recursive search_key_recursive (jsonlevel) as(
    values ('{"fr": {"WantedKey": "a1", "Sub": [{"WantedKey": ["b1", "b2"]}], "AnotherSub": [{"WantedKey": "c1"}]}}'::jsonb)
    union all
    select 
        case jsonb_typeof(jsonlevel)           
            when 'object' then (jsonb_each(jsonlevel)).value        
            when 'array' then jsonb_array_elements(jsonlevel)   
        end as jsonlevel
    from search_key_recursive where jsonb_typeof(jsonlevel) in ('object', …
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

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

数组列的外键

我有一张桌子:

CREATE TABLE methods
(
    method_id serial PRIMARY KEY,
    method_name varchar(100)
);
Run Code Online (Sandbox Code Playgroud)

我现在想创建一个包含以下列的表:

CREATE TABLE experiments 
(
    method integer[] REFERENCES methods(method_id),
    trials integer
);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

键列“method”和“method_id”是不兼容的类型:整数[]和整数。

我知道列必须是相同的类型,我还看到有些人已经尝试在数组问题上解决这个外键:

PostgreSQL 9.3 开发:Array ELEMENT 外键

我的兴趣是 'method' 应该是一个整数数组,引用来自表 'methods' 的 'method_id',但我无法弄清楚。我认为上面的链接可能是一个解决方案,但似乎没有实现(?)

一些帖子建议使用连接/连接表:

数组成员的外键约束?

我是一个绝对的初学者,我还无法弄清楚。对我来说,首先要了解如何解决数组上的外键问题。可以将多个方法视为形成一类方法。每个班级可以有一定数量的试验。

postgresql referential-integrity array

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

在 MS SQL Server 中正确使用 varbinary 类型

我在一个新职位上,被告知要实现一个存储过程,该过程将接受用户 ID 列表并更新一个标志。

当我建议使用表值参数(数组模拟)时,我被告知要实现如下所示,因为这是以前的做法。我不是 DBA,但我是一名全栈开发人员,这对我来说很有趣。

仅供参考 - 用户 ID 实现为类型 int

CREATE PROCEDURE [dbo].[UpdateUsers]       
 @rgIDs varbinary(max)      -- contains several ids
AS      
 DECLARE @tblTmp TABLE (ID int PRIMARY KEY)      

 DECLARE @ich int, @cch int, @ID int      
 SET @cch = DATALENGTH (@rgIDs)      
 SET @ich = 1   

 WHILE (@ich < @cch)      
 BEGIN      
  SET @ID = SUBSTRING (@rgIDs, @ich, 4) 

  UPDATE dbo.Users u 
  SET isUpdated = 1
  WHERE u.ID = @ID

  SET @ich = @ich + 4      
 END      
Run Code Online (Sandbox Code Playgroud)

不是表值类型在这里工作得更好吗?更具可读性、性能、更不容易出错等......?

我相信我将使用 SQL Server 2012 或 …

sql-server t-sql parameter array table-valued-parameters

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

使用 array_position() 函数从 pg_stats 获取列最常见的值

我正在尝试执行这个简单的查询,以检查某个值(1000)是否属于 Postgres 查询优化器使用的 MCV 列表:

SELECT array_position(most_common_vals, 1000) 
FROM pg_stats 
WHERE tablename = 'tenk1' 
AND attname = 'unique1';
Run Code Online (Sandbox Code Playgroud)

但收到以下错误消息:

ERROR:  function array_position(anyarray, integer) does not exist
Run Code Online (Sandbox Code Playgroud)

如何解决?

array_position()是此处描述的标准函数,以下语句按预期返回2

SELECT array_position('{1,2,3}', 2);
Run Code Online (Sandbox Code Playgroud)

postgresql performance datatypes array postgresql-performance

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