小编Erw*_*ter的帖子

检查是否存在连续的日期间隔

我在 PostgreSQL 中有一个表,它描述了一些具有开始日期和结束日期的事件:

CREATE TABLE my_table
(
  event_id serial NOT NULL,
  start_date timestamp without time zone NOT NULL,
  end_date timestamp without time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

单个事件可能与前一个和下一个事件重叠。在下表中,4 个事件中的前 3 个形成连续的时间间隔:

1   '2015-04-02 22:09:03'   '2015-04-02 22:19:05'
2   '2015-04-02 22:17:38'   '2015-04-02 22:27:38'
3   '2015-04-02 22:25:21'   '2015-04-02 22:36:23'
4   '2015-04-02 22:45:23'   '2015-04-02 22:55:23'
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个查询来检查两个给定日期之间是否存在连续的日期间隔?

我想要一些类似的东西:

select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions gaps-and-islands

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

PostgreSQL 强制所有数据大写

有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?

postgresql postgresql-9.4 case-sensitive

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

向 Postgres 数据库添加新的排序规则

我有这些整理:

postgres=# select * from pg_collat​​ion;
  姓名 | collnamespace | 领主| collencoding | 整理 | 类型  
------------+--------------+-----------+--------- -----+-------------+------------
 默认 | 11 | 10 | -1 | |
 C | 11 | 10 | -1 | C | C
 POSIX | 11 | 10 | -1 | POSIX | POSIX
 zh_CN | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 en_US.utf8 | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 ucs_basic | 11 | 10 | 6 | C …

postgresql collation localization

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

Postgres 9.4+:JSONB 而不是 EAV

我正在想办法构建一个新的 PostgreSQL 数据库,我很好奇是否可以使用 JSONB 列而不是 EAV 模型来存储实体的属性。这似乎是一种灵活的方式来存储这些东西。

在 EAV 情况下,我将有 3 个表:

materials (mat_id, mat_name, mat_descr)
material_properties (prop_id, prop_name, prop_desc)
material_property_values (mat_id, prop_id, val)
Run Code Online (Sandbox Code Playgroud)

每种材料都可以有一组不同的属性。

有什么原因我不应该只mat_props JSONB在我的materials表中添加一列,并将所有属性存储在那里{"name":"value"}?这样,将属性作为列进行查询将非常简单:

SELECT mat_name, mat_props->'name' as propval FROM materials
Run Code Online (Sandbox Code Playgroud)

而不是连接或子选择。

另外,我是否可以在materials表中添加此列,或者将其保存在单独的表中是否会更高效:

material_properties (mat_id, properties JSONB)
Run Code Online (Sandbox Code Playgroud)

postgresql database-design eav json

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

截断父表但不截断子表

我在 PostgreSQL 9.4 中有一个表,我对其进行了分区,以便对父分区的所有插入实际上都进入其中一个子分区。问题是在创建分区之前,我的父表中已经有数亿行数据。

父级和子级存在于不同的模式中:

家长:public.history_uint
孩子:partitions.history_uint_p2015_mm_dd

这是我创建分区的方式。

TRUNCATE父母如何而不是孩子?

postgresql partitioning truncate postgresql-9.4

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

如何记录单个连接或用户或客户端主机的所有 SQL 查询?

有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?

换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。

一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。

postgresql log postgresql-9.3

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

如何查看 PostgreSQL 事务中更改的元组?

BEGIN;

   INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');

   -- SELECT * FROM pg_stat_activity WHERE ...
   -- shows records with a flag if they have been added/deleted/updated

END;
Run Code Online (Sandbox Code Playgroud)

有没有办法查看 PostgreSQL 9.x 中给定表的事务未提交的插入/删除?这纯粹是为了视觉确认。

虽然我最初的想法是否定的(只对表执行 SQL-Select),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。

postgresql transaction

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

有没有办法部分初始化 TYPE?

我创建了一个自定义类型:

CREATE TYPE my_type as(name text, street text, location text);
Run Code Online (Sandbox Code Playgroud)

初始化这样的类型很容易:

SELECT ROW('a', 'b', 'c')::my_type;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法可以部分初始化类型,这意味着所有未提及的列都隐式设置为 null。在伪代码中,类似于:

SELECT ROW('a', 'c')::my_type(name, location);
Run Code Online (Sandbox Code Playgroud)

另外,当列未按正确顺序提及时,是否还有一种初始化类型的方法?在伪代码中,类似于:

SELECT ROW('c', 'a', 'b')::my_type(location, name, street);
Run Code Online (Sandbox Code Playgroud)

postgresql syntax datatypes cast composite-types

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

NULL 值导致 SELECT 结果中的空白行用于文本连接

我有一个查询,用于生成一些文本以创建一些 VALUES 文本以放入 .sql 文件以插入一些行。我在结果中得到一个空行:

postgres=# SELECT '  (' || obj_id || ', ''' || obj_type || '''),' FROM il2.objects WHERE obj_id < 11 ORDER BY obj_id;
        ?column?         
-------------------------
   (1, 'ScienceDomain'),

   (3, 'PIs'),
   (10, 'Instrument'),
(4 rows)
Run Code Online (Sandbox Code Playgroud)

执行 a select *,很明显它是由obj_typeNULL 为obj_id2引起的:

postgres=# SELECT * FROM il2.objects WHERE obj_id < 11;
 obj_id |   obj_type    
--------+---------------
     10 | Instrument
      1 | ScienceDomain
      2 | 
      3 | PIs
(4 rows)
Run Code Online (Sandbox Code Playgroud)

(确认它是NULL):

postgres=# SELECT * FROM il2.objects WHERE …
Run Code Online (Sandbox Code Playgroud)

postgresql null select concat

6
推荐指数
2
解决办法
962
查看次数

在 json/jsonb 行上使用 IS DISTINCT FROM 触发而不进行比较逐项?

当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at = now();
    RETURN NEW;
  ELSE
    RETURN OLD;
  END IF;
END;
$$ language 'plpgsql';

CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)

当我插入包含 json 和 jsonb 列的表时,出现以下错误:

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql json postgresql-9.6

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