小编Erw*_*ter的帖子

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

我有一个"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万
查看次数

如何从 PostgreSQL 中的 JSON[] 数组中删除已知元素?

我遇到了在 PostgreSQL 中使用 JSON 数据类型的问题。我尝试实现在数据库中存储非规范化的 Java 模型。该模型具有复杂对象列表。因此,我决定将它们建模为原生 PostgreSQL 数组中的 JSON。

这是我的表创建语句的精简片段:

CREATE TABLE test.persons
(
  id UUID,
  firstName TEXT,
  lastName TEXT,
  communicationData JSON[],
  CONSTRAINT pk_person PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个以 JSON 格式显示通信数据对象列表的人。其中一个对象可能如下所示:

{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}
Run Code Online (Sandbox Code Playgroud)

我可以使用 PostgreSQL 的 array_append 轻松地将这样的 JSON 对象附加到数组中。但是,我无法从数组中删除已知值。考虑一下这个 SQL 语句:

UPDATE test.persons
SET communicationData = array_remove(
      communicationData, 
      '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}'::JSON
    )
WHERE id = 'f671eb6a-d603-11e3-bf6f-07ba007d953d';
Run Code Online (Sandbox Code Playgroud)

这失败了ERROR: could not identify an equality operator for type json。您是否有提示我如何从 JSON 数组中删除已知值?也可以按数组中的位置删除,因为我知道一个也......

PostgreSQL …

postgresql update array json

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

存储数百万行非标准化数据或一些 SQL 魔法?

我的 DBA 经验只是简单的存储 + CMS 样式数据的检索 - 所以这可能是一个愚蠢的问题,我不知道!

我有一个问题,我需要查找或计算特定组大小和特定时间段内特定天数的假期价格。例如:

1 月任何时候 2 人 4 晚的酒店房间多少钱?

例如,我有 5000 家酒店的定价和可用性数据,如下所示:

Hotel ID | Date | Spaces | Price PP
-----------------------------------
     123 | Jan1 | 5      | 100
     123 | Jan2 | 7      | 100
     123 | Jan3 | 5      | 100
     123 | Jan4 | 3      | 100
     123 | Jan5 | 5      | 100
     123 | Jan6 | 7      | 110
     456 | Jan1 | 5      | 120
     456 | Jan2 …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions datetime denormalization

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

如何创建 Postgres 触发器以确保字段不可更新

我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。

1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_idNEW.?

CREATE FUNCTION check_id_change() RETURNS TRIGGER AS $$
    BEGIN
        IF OLD.original_id <> NEW.original_id THEN
            RAISE EXCEPTION 'cannot change original_id'; 
        END IF;
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER client_update_trigger AFTER UPDATE ON client FOR EACH ROW
      EXECUTE PROCEDURE check_id_change();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

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

来自日期的函数 extract() 返回双精度值

为什么 Postgres 函数从值extract()返回?double precisiondate

我能想象的唯一原因是,有一些语言环境使用日历(那些不是公历并由 Postgres 支持),以不同的方式计算日期/时间并可能返回浮点数。

postgresql date-format 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万
查看次数

大型 VARCHAR 的唯一约束 - PostgreSQL

我有一个列定义如下:

data_url character varying(32768) NOT NULL
Run Code Online (Sandbox Code Playgroud)

和该列的 UNIQUE 约束:

CONSTRAINT unique_data_url UNIQUE (data_url)
Run Code Online (Sandbox Code Playgroud)

当一个大对象被插入到表中时,会出现以下错误信息:

ERROR:  index row requires 32584 bytes, maximum size is 8191
Run Code Online (Sandbox Code Playgroud)

如何设置 PostgreSQL 以便能够索引大于 8191 个字符的对象?空间和速度都不是问题。它是一个很少更改的表,最多有数百行。

环境:PostgreSQL 9.3.6,Fedora 20 x64

postgresql index varchar postgresql-9.3 unique-constraint

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

如何使用数据类型的默认值作为列默认值?

如何为 DDL 中的列指定默认值?我很确定以下方法不久前有效:

CREATE TABLE test
(
  col_1 CHAR(12) NOT NULL,
  col_2 INTEGER  NOT NULL WITH DEFAULT,
  col_3 CHAR(12) NOT NULL WITH DEFAULT
);
Run Code Online (Sandbox Code Playgroud)

我只想定义 DB 应该使用列数据类型的默认值(就像我上面的例子一样),而不是具体指定哪个值。

postgresql database-design datatypes ddl

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