PostgreSQL 9.2 引入了json字段类型。为什么以及何时应该使用它?它比文本字段有什么好处?
我以为有新的查询选项可用,但我没有看到任何选项。我错过了什么吗?
我正在使用 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) 在数据库中,我有两个表:
taxonomy_id是一个integerID是一个character varying这两个表是相关的:如果它在第一个表中存在一行,那么taxonomy_id = N它就会在第二个表中存在一行ID = N.toString。
现在,我想在这两个表之间进行连接;由于类型不匹配,“正常”连接自然不起作用。
你能帮我解决这个问题吗?
我正在使用PostgreSQL.
我有一个"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) 有没有办法索引以下查询?
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) 假设我有一个名为 的表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) 我无法让 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) 我正在阅读有关新的Postgres 10 标识列的信息,并了解了如何使用它SERIAL在CREATE 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 ×9
plpgsql ×3
functions ×2
join ×2
trigger ×2
aggregate ×1
alter-table ×1
datatypes ×1
dynamic-sql ×1
identity ×1
index ×1
index-tuning ×1
json ×1
oracle ×1
syntax ×1