小编Erw*_*ter的帖子

我可以用新的 json 字段做什么?

PostgreSQL 9.2 引入了json字段类型。为什么以及何时应该使用它?它比文本字段有什么好处?

我以为有新的查询选项可用,但我没有看到任何选项。我错过了什么吗?

postgresql postgresql-9.2 postgresql-9.3 json

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

Postgres RIGHT JOIN 与自定义数组

我正在使用 Postgres 9.1 并希望得到一些没有数据的空白结果。我的查询如下所示:

SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)
Run Code Online (Sandbox Code Playgroud)

... 对这个问题并不重要,重要的是它返回一个包含数组中机构 ID 的结果 (1, 3, 4, 5, 7, 9) 并且它包括那些没有数据的机构。以下是当前输出的示例:

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7
Run Code Online (Sandbox Code Playgroud)

我想要的输出示例是:

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7
               9
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过使用以下查询来实现这一点:

SELECT *
FROM (
       SELECT institution_id
       FROM ... 
       WHERE institution_id IN (1, 3, …
Run Code Online (Sandbox Code Playgroud)

postgresql join

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

加入不同类型

在数据库中,我有两个表:

  1. 首先有一个名为场taxonomy_id是一个integer
  2. 后者有一个名为场ID是一个character varying

这两个表是相关的:如果它在第一个表中存在一行,那么taxonomy_id = N它就会在第二个表中存在一行ID = N.toString

现在,我想在这两个表之间进行连接;由于类型不匹配,“正常”连接自然不起作用。

你能帮我解决这个问题吗?

我正在使用PostgreSQL.

postgresql join datatypes

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

查找任何列与搜索模式匹配的行

我有一个"Test"包含 15 个不同数据类型的不同列的表。

我正在寻找具有像"ABC". 但是"ABC"可以出现在任何列中,我想找到具有"ABC".

我不能使用 WHERE 子句限制行,因为我真的不知道ABC驻留在哪一列?有没有办法做到这一点?

oracle

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

从 UDF 返回的匿名记录自动转换为众所周知的表类型

专有代码(我们无法更改)有一堆用户定义的函数类型:

create or replace function f() returns record as $$ ... $$
Run Code Online (Sandbox Code Playgroud)

我们通过以下方式调用它(例如):

SELECT status, log FROM f() as (status boolean, log text);
Run Code Online (Sandbox Code Playgroud)

(status boolean, log text)是 table 的行类型T。是否可以在不列出属性的情况下自动将record(或setof record返回类型)转换为T行类型?我正在寻找的是那种:

SELECT * FROM f() as T%rowtype
Run Code Online (Sandbox Code Playgroud)

postgresql type-conversion plpgsql functions composite-types

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

从触发器调用多个函数?

我运行PostgreSQL-9.2.4

是否可以从触发器调用 2 个函数?

假设以下触发器触发时,我有两个函数可以执行两个不同的表:

扳机:

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)

功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

功能 2:( 如果插入的组合tasksystem已经出现在表中=> 将此组合标记为任何较早的记录deleted

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql functions

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

Postgres 使用 MAX 和 groupBy 索引查询

有没有办法索引以下查询?

SELECT run_id, MAX ( frame ) , MAX ( time ) FROM run.frames_stat GROUP BY run_id;
Run Code Online (Sandbox Code Playgroud)

我尝试在frameand上创建排序(非复合)索引time,并在 上创建索引run_id,但查询规划器不使用它们。

杂项信息:

  • 不幸的是(出于我不会进入的原因)我无法更改查询
  • frames_stat表有 4200 万行
  • 表格不变(不会发生进一步的插入/删除)
  • 查询总是很慢,只是变慢了,因为这个数据集比过去大。
  • 表上没有索引
  • 我们正在使用 Postgres 9.4
  • 数据库的“work_mem”大小为 128MB(如果相关)。
  • 硬件:130GB 内存,10 核至强

架构:

CREATE TABLE run.frame_stat (
  id bigint NOT NULL,
  run_id bigint NOT NULL,
  frame bigint NOT NULL,
  heap_size bigint NOT NULL,
  "time" timestamp without time zone NOT NULL,
  CONSTRAINT frame_stat_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

解释分析:

HashAggregate  (cost=1086240.000..1086242.800 …
Run Code Online (Sandbox Code Playgroud)

postgresql index aggregate index-tuning postgresql-9.4

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

PostgreSQL中具有主键的重复行

假设我有一个名为 的表people,其中id是主键:

+-----------+---------+---------+
|  id       |  fname  |  lname  |
| (integer) | (text)  | (text)  |
+===========+=========+=========+
|  1        | Daniel  | Edwards |
|  2        | Fred    | Holt    |
|  3        | Henry   | Smith   |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。

我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:

INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加一age列,则需要修改查询以同时考虑年龄列。

显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint-- 而且,无论如何我都不希望它们共享相同的 ID:

INSERT INTO people …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql default-value postgresql-9.4

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

PostgreSQL 在查询 INSTEAD OF 触发器时使用 NEW

我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:

CREATE TABLE Product (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR
);
CREATE TABLE Purchase (
  purchase_id SERIAL PRIMARY KEY,
  product_id INT REFERENCES Product,
  when_bought DATE
);

CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)

我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:

INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)

我的想法是这样的:

CREATE OR REPLACE FUNCTION insert_purchaseview_func()
  RETURNS trigger AS
$BODY$
BEGIN
  INSERT INTO Purchase(product_id, when_bought) …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger syntax plpgsql

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

如何将 PostgreSQL 10 标识列添加到现有表中?

我正在阅读有关新的Postgres 10 标识列的信息,并了解了如何使用它SERIALCREATE TABLE.

是否也可以向现有表添加标识列?

例如,使用旧SERIAL列,我可以执行以下操作:

ALTER TABLE sourceTable ADD  COLUMN ogc_fid SERIAL;
Run Code Online (Sandbox Code Playgroud)

对于标识列,是否有与上述相同的内容?我试过:

ALTER TABLE sourceTable ADD  COLUMN ogc_fid GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)

但是得到了一个错误:

错误:“BY”第 1 行或附近的语法错误:...R TABLE sourceTable ADD COLUMN ogc_fid GENERATED BY DEFAULT

我正在考虑用我的脚本中的SERIAL列替换列IDENTITY,只是想检查这是否可行。

postgresql alter-table identity postgresql-10

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