您好,我想从记录中动态获取列名。如下面的代码所示,我创建了一个游标,并使用循环通过将每一行提取到记录类型 r1 来处理该游标中的每条记录。在我的表中,我有这些列 [dlq_2000,dlq_2001,...,dlq_2017,dlq_2017]。我还在其顶部创建了一个循环来单独处理每一列。
我面临的问题是动态从 r1 获取字段名称,当我运行代码时收到此错误:
[Err] 错误:记录“r1”没有字段“'dlq_'||counter::text”上下文:SQL 语句“SELECT (r1."'dlq_'||counter::text" = 1 )”
请建议如何解决这个问题。
谢谢你,
CREATE OR REPLACE FUNCTION update()
RETURNS VOID AS $$
DECLARE
cur SCROLL CURSOR FOR select * from my_tbl;
r1 RECORD;
begin
OPEN cur ;
FOR counter IN 2000..2017 LOOP
r1 := NULL;
LOOP
FETCH cur INTO r1;
EXIT WHEN NOT FOUND;
IF (r1."'dl_'||counter::text" = 1 ) THEN
-- do some thing
RAISE NOTICE 'processing year of : %', counter;
END IF;
END LOOP;
END …Run Code Online (Sandbox Code Playgroud) 如何在 PostgreSQL 中对表进行索引,以便最小/最大查询尽快返回?
我有一个包含几亿行的大表。每行都有一个 source_id 和最后更新记录的日期。我想收集每个 source_id 的一些统计信息,特别是每个 source_id 的最小和最大日期范围。
所以我在我的表上创建了这个索引:
CREATE INDEX CONCURRENTLY mydata_source_last_updated_date ON mydata (source_id, last_updated_date ASC);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用以下命令查询每个源的最短日期时:
SELECT source_id, MIN(last_updated_date) FROM mydata GROUP BY source_id;
Run Code Online (Sandbox Code Playgroud)
查询大约需要一个小时才能完成。
对于这么大的表,即使有索引,这是否是正常的性能?我怎样才能减少这个查询时间?
在创建索引之前,有什么方法可以粗略估计索引的大小(在磁盘上)?表和每列的大小是已知的。我对索引特别感兴趣GIN。此外,了解不同索引类型的大小如何彼此相关的任何信息。是否有一个一般的经验法则,比如GIN索引总是大于B-TREE索引?或者它是否太依赖于数据大小和分布?
澄清一下:我不是在寻找工具。我很高兴用手做。
正如预期的那样,当进行这样的相等测试时,比较成功:
CREATE TABLE citext_test (
value citext PRIMARY KEY
);
INSERT INTO citext_test VALUES ('one');
INSERT INTO citext_test VALUES ('two');
SELECT * FROM citext_test WHERE value = 'One';
Run Code Online (Sandbox Code Playgroud)
但是,如果要比较的值是“text”类型,则比较失败:
SELECT * FROM citext_test WHERE value = 'One'::text;
Run Code Online (Sandbox Code Playgroud)
使用 EXPLAIN,第一个示例中的原始值似乎被转换为 CITEXT:
Index Only Scan using citext_test_pkey on citext_test (cost=0.15..8.17 rows=1 width=32)
Index Cond: (value = 'One'::citext)
Run Code Online (Sandbox Code Playgroud)
我想与连接表中的 TEXT 列进行比较。我真的需要将这些列转换为 CITEXT 才能进行比较吗?我认为使用 CITEXT 的部分优点是不必记住添加这样的东西(例如 LOWER(some_value));
PostgreSQL 9.6。我刚刚在飞路迁移中发现了这两个命令,彼此相邻。我觉得它们可能是多余的,但是这些陈述有何不同?有理由同时使用两者吗?如果这是重复的,我们深表歉意;我找不到答案。
tsrange 如何以二进制形式存储?
例如创建表
CREATE TABLE public.test (t tsrange);
INSERT INTO test VALUES ('[2010-01-01 14:30, 2010-01-01 15:30)');
INSERT INTO test VALUES ('[2011-01-01 14:31, 2015-11-01 15:30)');
INSERT INTO test VALUES ('[2017-01-01 14:31, 2018-11-01 15:30)');
COPY test TO '/tmp/pgcopy' WITH (FORMAT binary);
COPY test TO '/tmp/pgcopy.csv' WITH (FORMAT csv);
Run Code Online (Sandbox Code Playgroud)
它输出:
cat /tmp/pgcopy.csv
"[""2010-01-01 14:30:00"",""2010-01-01 15:30:00"")"
"[""2011-01-01 14:31:00"",""2015-11-01 15:30:00"")"
"[""2017-01-01 14:31:00"",""2018-11-01 15:30:00"")"
hexdump -C /tmp/pgcopy
00000000 50 47 43 4f 50 59 0a ff 0d 0a 00 00 00 00 00 00 |PGCOPY..........|
00000010 …Run Code Online (Sandbox Code Playgroud) 假设我有两张桌子。其中一个以一对多关系引用另一个:
CREATE TABLE t (
id SERIAL PRIMARY KEY
, name text
);
INSERT INTO t (name) VALUES ('one'), ('two'), ('three');
CREATE TABLE y (
id SERIAL PRIMARY KEY
, tid INTEGER REFERENCES t
, amount INTEGER
);
INSERT INTO y (tid, amount) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(3, 1);
Run Code Online (Sandbox Code Playgroud)
我可以从这些表中查询数据,以获得与 和t上设置的特定条件匹配的行:ty
SELECT row_to_json(t.*) as "t_nogroup" FROM t
JOIN y ON t.id = y.tid
WHERE t.id = 1
AND y.amount > 1; …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种既定的方法来测试两个 PostgreSQL 表/关系是否具有相同的结构。换句话说,如何测试它们是否彼此兼容,因为我可以对它们执行诸如UNION ALL和 之类的集合操作?EXCEPT
我在 DBA.SE 和其他地方搜索,只能找到有关查找两个表的内容是否不同的问题(例如,检查两个表在 PostgreSQL 中是否具有相同的内容),或者当兼容性已知时(例如,比较两个表)具有相同的结构,但成员数量不同)。但我有兴趣检查表结构的兼容性。
我使用的是 PostgreSQL 10.3,但符合标准的方式当然更好。
我们正在迁移到新的记录管理系统,我正在解决数据迁移的问题。源数据和目标数据都在Postgresql中
在源数据库中,对于同一供应商的每个授权代码以及该授权的开始和结束日期,我们有多个行。
+----------+---------------+------------+-----------+
| Vendor | Authorization | Start Date | End Date |
+----------+---------------+------------+-----------+
| Vendor 1 | ##### | 1/1/2017 | 2/28/2017 |
| Vendor 1 | ##### | 3/1/2017 | 4/15/2017 |
| Vendor 2 | ##### | 4/16/2017 | 5/31/2017 |
| Vendor 2 | ##### | 6/1/2017 | 7/12/2017 |
| Vendor 1 | ##### | 7/13/2017 | 9/30/2017 |
+----------+---------------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)
在目标数据库中,我们有给定时间的活动供应商关系的记录,以及开始日期和结束日期。(Auth # 开始和结束日期单独跟踪)迁移后,前面列出的示例应如下所示。
+----------+------------+-----------+
| Vendor | Start Date | End Date |
+----------+------------+-----------+ …Run Code Online (Sandbox Code Playgroud) 我是 postgres 的新手,我想将它与 postGIS 一起使用。一切都很完美。我使用的默认端口是 5432。我想知道是否可以使用多个端口(即 5430-5431-5432-5433 ...等)或范围(即 5430-5)连接到数据库。这背后的原因是我试图从不同来源获得多个更新,并且我不希望使用同一端口遇到瓶颈。
postgresql ×10
performance ×2
citext ×1
copy ×1
date-format ×1
dump ×1
fields ×1
index ×1
index-tuning ×1
metadata ×1
optimization ×1
plpgsql ×1
union ×1
view ×1