小编Erw*_*ter的帖子

从 count() 确定百分比没有转换问题

我正在尝试运行以下查询以提供patients表中具有refinst列值的行的百分比。我一直得到0的结果。

select (count (refinst) / (select count(*) from patients) * 100) as "Formula" 
from patients;
Run Code Online (Sandbox Code Playgroud)

该表有 15556 行,并select count(refinst) from patients告诉我其中 1446行在列中有值refinst。我想从查询中得到的响应是 30.62 ( 1446/15556*100=30.62XXXXX,四舍五入到两位小数)。

我很确定它与计数结果的数据类型(我假设是整数)有关。如果我将一个整数除以一个整数并且结果小于 0,它会被截断为 0 是否正确?如果是这种情况,有人可以告诉我如何将计数结果转换为带有 2 个小数位的数字,以便结果也四舍五入到 2 个小数位吗?

我确信有比多个 count 语句更好的方法来编写此代码。我正在寻找一种更高效的方式来编写这个查询。

postgresql datatypes count cast

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

恢复转储时禁用所有约束和表检查

我已经获得了我的 PostgreSQL 数据库的转储:

pg_dump -U user-name -d db-name -f dumpfile
Run Code Online (Sandbox Code Playgroud)

然后我继续在另一个数据库中恢复:

psql X -U postgres  -d db-name-b -f dumpfile
Run Code Online (Sandbox Code Playgroud)

我的问题是数据库包含引用约束、检查和触发器,其中一些(特别是检查)在恢复过程中失败,因为信息没有按照会导致这些检查得到遵守的顺序加载。例如,在表中插入一行可能与CHECK调用一个plpgsql函数相关联,该函数检查某个条件是否在某个其他不相关的表中成立。如果后者没有psql在前者之前加载,则会发生错误。

下面是一个 SSCCE,它产生了这样一个一旦转储pg_dump就无法恢复的数据库:

CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
    SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;

CREATE TABLE IF NOT EXISTS a (
     i              INTEGER                    NOT NULL
);

INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
    i  INTEGER NOT NULL
);
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design postgresql-9.1 pg-dump check-constraints

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

触发器:将删除的行移动到归档表

我的restrictionsPostgreSQL 数据库中有一个小(约 10 行)表,其中每天删除和插入值。

我想要一个名为 的表restrictions_deleted,从中删除的每一行都restrictions将自动存储。由于restrictions具有序列号,因此不会有重复项。

如何在 PostgreSQL 中编写这样的触发器?

postgresql trigger delete plpgsql

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

如何从 PostgreSQL 中的 jsonb 数组中获取特定对象?

我有一个名为“user”的字段,其中包含一个大致如下所示的 json 数组:

"user"

[{ "_id" : "1", "count" : "4" }, { "_id" : "3", "count": "4"}]
Run Code Online (Sandbox Code Playgroud)

现在我想要一个像这样的查询:

select count from tablename where id = "1"
Run Code Online (Sandbox Code Playgroud)

我无法count从 PostgreSQL 9.4 中的 json 对象数组中获取特定字段。

postgresql array json postgresql-9.4

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

了解 postgresql.conf 文件中的“max_wal_size”和“min_wal_size”参数默认值

根据参数的文档,min_wal_sizemax_wal_size默认值为:

对于max_wal_sizeThe default is 1 GB
对于min_wal_sizeThe default is 80 MB

然后我从我的数据库配置中查看这些参数:

select name, setting, unit 
from pg_settings 
where name in ('min_wal_size', 'max_wal_size')
Run Code Online (Sandbox Code Playgroud)

给出结果:

name         |  setting | unit
----------------------------------
max_wal_size | 64       | 
min_wal_size | 5        |
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1) 为什么这些值与文档中显示的默认值不匹配?我从来没有改变过配置设置。

2) 为什么unit这些参数的列是空的/NULL?在这种情况下,64 和 5 值是什么意思?MB? GB? 或者是什么?

为什么这不像例如 work_mem参数,当一切都清楚时:

name         | setting  | unit
----------------------------------
work_mem     | 4096     | kB
Run Code Online (Sandbox Code Playgroud)

postgresql configuration write-ahead-logging postgresql-9.5

21
推荐指数
2
解决办法
3万
查看次数

如何按 XYZ 等典型软件版本进行订购?

给定一个“SoftwareReleases”表:

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
Run Code Online (Sandbox Code Playgroud)

我如何产生这个输出?

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |
Run Code Online (Sandbox Code Playgroud)

postgresql order-by sorting natural-sort

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

带有 NULL 值的 PostgreSQL UPSERT 问题

我在 Postgres 9.5 中使用新的 UPSERT 功能时遇到问题

我有一个表,用于从另一个表聚合数据。复合键由 20 列组成,其中 10 列可以为空。下面我创建了我遇到的问题的较小版本,特别是 NULL 值。

CREATE TABLE public.test_upsert (
upsert_id serial,
name character varying(32) NOT NULL,
status integer NOT NULL,
test_field text,
identifier character varying(255),
count integer,
CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id),
CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field)
);
Run Code Online (Sandbox Code Playgroud)

根据需要运行此查询(首先插入,然后插入只会增加计数):

INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) 
VALUES ('shaun',1,'test value','ident', 1)
ON CONFLICT (name,status,test_field) DO UPDATE set count = tu.count + 1 
where tu.name = 'shaun' AND tu.status = 1 AND tu.test_field = …
Run Code Online (Sandbox Code Playgroud)

postgresql null upsert unique-constraint postgresql-9.5

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

如何将现有索引提升为 PostgreSQL 中的主键

我知道如何在表中创建主键,但如何将现有索引设为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引是这种形式:

"my_index" PRIMARY KEY, btree (column1, column2)
Run Code Online (Sandbox Code Playgroud)

我已经创建了索引:

CREATE INDEX my_index ON my_table (column1, column2)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使它成为主键......

更新:我的服务器版本是 8.3.3

postgresql index primary-key

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

如何在生成的表定义未知的情况下生成旋转的 CROSS JOIN?

给定两个带有名称和值的未定义行数的表,我将如何显示CROSS JOIN函数对其值的透视。

CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);

CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Run Code Online (Sandbox Code Playgroud)

例如,如果该函数是乘法,我将如何生成如下所示的(乘法)表,

1..12的常用乘法表

所有这些(arg1,arg2,result)行都可以用

SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar; 
Run Code Online (Sandbox Code Playgroud)

所以这只是一个演示问题,我希望这也适用于自定义名称——该名称不仅仅是CAST文本的参数,而是设置在表格中,

CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);

CREATE TEMP TABLE bar AS
SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot dynamic-sql

19
推荐指数
2
解决办法
6629
查看次数

在 WHERE 子句中使用列别名不起作用

给定一个users包含两个字段的表:idemail

select id, email as electronic_mail 
from (  
        select id, email 
        from users
) t 
where electronic_mail = ''
Run Code Online (Sandbox Code Playgroud)

Postgres 抱怨说:

ERROR:  column "electronic_mail" does not exist
Run Code Online (Sandbox Code Playgroud)

这个例子只是为了说明出现的问题。我的实际情况更复杂,我遍历 json 列中的元素数组,从每个元素中获取一个标量值。(如果有帮助,我可以分享一些代码。)

我真的不明白会有什么并发症,可能我不知道什么。我的印象是可以在WHERE子句中使用别名列而没有问题?

postgresql subquery alias where

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