我有一个"Test"包含 15 个不同数据类型的不同列的表。
我正在寻找具有像"ABC". 但是"ABC"可以出现在任何列中,我想找到具有"ABC".
我不能使用 WHERE 子句限制行,因为我真的不知道ABC驻留在哪一列?有没有办法做到这一点?
专有代码(我们无法更改)有一堆用户定义的函数类型:
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
我运行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:(
如果插入的组合task和system已经出现在表中=> 将此组合标记为任何较早的记录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 中使用 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 …
我的 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) 我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。
1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_id以NEW.?
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) 为什么 Postgres 函数从值extract()返回?double precisiondate
我能想象的唯一原因是,有一些语言环境使用日历(那些不是公历并由 Postgres 支持),以不同的方式计算日期/时间并可能返回浮点数。
有没有办法索引以下查询?
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 万行架构:
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) 我有一个列定义如下:
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)
当一个大对象被插入到表中时,会出现以下错误信息:
Run Code Online (Sandbox Code Playgroud)ERROR: index row requires 32584 bytes, maximum size is 8191
如何设置 PostgreSQL 以便能够索引大于 8191 个字符的对象?空间和速度都不是问题。它是一个很少更改的表,最多有数百行。
环境:PostgreSQL 9.3.6,Fedora 20 x64
如何为 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 应该使用列数据类型的默认值(就像我上面的例子一样),而不是具体指定哪个值。