标签: postgresql

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
查看次数

如何在 Postgres 上设置具有正确权限的角色和用户?

我当前的数据库uat作为 owner postgres。但现在我想设置具有正确权限的角色和用户。一些简单的东西,比如:

角色dbadeveloperapplication

用户: dba1, dev1, dev2,app1

哪里dba可以在数据库上做任何事情以进行管理;developer可以进行SELECT,UPDATEINSERT, 通常的开发人员操作;app1developer角色相同的操作,暂时。

我怎样才能正确地做到这一点?production在这个新设置中,谁应该是我表的所有者?

更新:

------------------------
-- INITIAL SETUP
------------------------

-- create uat database
create database uat;

-- dba role
create role dba with superuser createdb createrole nologin replication bypassrls;

-- dev role
create role dev with nosuperuser nocreatedb nocreaterole nologin noreplication nobypassrls; …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.4

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

数组列的外键

我有一张桌子:

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
查看次数

如何在psql终端中粘贴汉字?

我正在尝试将中文字符粘贴到 psql 终端中:

$ psql
=> \encoding
=> UTF8
# Ctrl+v (?????)
=> ???????
Run Code Online (Sandbox Code Playgroud)

粘贴到普通终端(Max OS)时,它工作正常:

$ # Ctrl+v (?????)
$ ?????
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?

postgresql psql postgresql-9.4

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

错误:某些行违反了检查约束

我有以下错误:

ERROR: check constraint "cc_at_least_one_mapping_needed" is violated by some row
Run Code Online (Sandbox Code Playgroud)

询问:

ALTER TABLE integrations.tax_aggregates
DROP COLUMN IF EXISTS myob_id,
ADD COLUMN myob_id integrations.FOREIGN_IDENTIFIER;
COMMENT ON COLUMN integrations.tax_aggregates.myob_id IS 'Foreign key for MYOB';

ALTER TABLE integrations.tax_aggregates DROP CONSTRAINT IF EXISTS cc_at_least_one_mapping_needed,
ADD CONSTRAINT cc_at_least_one_mapping_needed CHECK ((("qb_id" IS NOT NULL) :: INTEGER +
                                                      ("xero_id" IS NOT NULL) :: INTEGER +
                                                      ("freshbooks_id" IS NOT NULL) :: INTEGER +
                                                      ("myob_id" IS NOT NULL) :: INTEGER +
                                                      ("ppy_id" IS NOT NULL) :: INTEGER) > 0); …
Run Code Online (Sandbox Code Playgroud)

postgresql constraint postgresql-9.2 check-constraints

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

如何设计一个数据库

包含每位员工日常活动的文件。它显示了员工在工作时间所做的详细描述。所以这些文件是由员工准备的。

现在,我的需求是如何为这个模型设计一个数据库。我只知道数据库的基础知识,但我没有设计任何数据库。因此,任何人都可以帮助我解决如何为应用程序创建数据库设计。

该设计还应该适用于查询以获取有关单个员工的详细信息,例如

例如:

  1. shiva 'shiva' 在 CCTNS 项目上花费的总时间

  2. 查找指定项目的团队负责人

  3. 查找特定项目中的成员

postgresql database-design

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

PostgreSQL 没有指定 COLLATION 的默认行为是什么?

如果我不在外部指定排序规则,PostgreSQL 的默认行为是什么?主要问题之一,是否区分大小写?

postgresql collation

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

查找跨表几乎相同行的更改列

我在 64 位 Windows 7 上运行 PostgreSQL 9.3.5。

我的数据每季度到达,在多个表 ( table1, ..., tableN) 中,这些表在周期内通过基于关键标识符的跨表约束进行链接。在其他列中,每个表都具有随时间持续存在的标识符pfi-持久特征标识符ufi-通用特征标识符

pfi每个表都是唯一的(非常罕见的是table1.pfi = table2.pfi.
ufi在所有表和所有时间都是唯一的。它不是行数据的散列,但您可以这样认为。

每个时期,在每个表中,一些新的pfi产生,一些旧pfi的退役。一些pfi改变属性。ufi跟踪给定(行)的任何属性的任何更改pfi,因此为它获取更改的(和新的)行table1只是一个问题:

-- 1st query
select a.*
into vm201512.property_d
from vm201512.property a
where not exists (select 1 from vm201412.property where ufi = a.ufi);
Run Code Online (Sandbox Code Playgroud)

这将选择pfi在至少一列中是新的 (new ) 或更改的所有行。

每个表的大约 96% 在各个方面都保持不变。因此,在分析跨周期变化时,我构建了一个仅包含更改数据和新数据的表。这将表大小从 ~3.5m 行减少到 …

postgresql dynamic-sql

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

如何处理具有单独日期和时间列的表中的日期时间范围?

在存储事件的表中,日期和时间是两个单独的列:

CREATE TABLE events (
    pk int serial, 
    detail text, 
    ev_date date, 
    ev time without time zone
);
Run Code Online (Sandbox Code Playgroud)

如果我过滤日期:

ev_date BETWEEN start_date::date AND end_date::date AND 
ev_time BETWEEN start_date::time AND end_date::time 
Run Code Online (Sandbox Code Playgroud)

我错过了每天时间范围之外发生的两个日期内的所有事件。

因此,开始时间仅与开始日期相关,与结束日期相同。

有人对如何有效地处理数百万个事件提出建议吗?

postgresql datetime postgresql-9.4

4
推荐指数
2
解决办法
502
查看次数

PostgreSQL 忽略 TEXT 字段上的(唯一)索引

我有一张users类似于

CREATE TABLE users (
  id bigserial NOT NULL,
  msisdn text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

以及在 上UNIQUE定义的约束msisdn

ALTER TABLE users ADD CONSTRAINT UNIQUE (msisdn);
Run Code Online (Sandbox Code Playgroud)

现在,我试着跑

EXPLAIN SELECT * FROM users WHERE msisdn = '000000000001';
Run Code Online (Sandbox Code Playgroud)

和 PostgreSQL 正在回归

Seq Scan on users  (cost=0.00..7.80 rows=1 width=400)
  Filter: (msisdn = '000000000001'::text)
Run Code Online (Sandbox Code Playgroud)

该表目前有 256 行。会不会是表太小以至于PostgreSQL认为做全表扫描而不是扫描索引更好?如何确保 PostgreSQL 实际使用索引而不是进行全表扫描?

postgresql index postgresql-9.4

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