是否可以将字段值扩展为比较运算符?像这样的东西:
create table math (
value1 int,
value2 int,
operator text
);
insert into math values(1,2,'>=');
select * from math where value1 operator value2;
PS:我知道可以通过 解决这个用例case when
,但想知道是否有替代解决方案。
是否可以将字段值扩展为比较运算符?像这样的东西:
create table math (
value1 int,
value2 int,
operator text
);
insert into math values(1,2,'>=');
select * from math where value1 operator value2;
PS:我知道可以通过 解决这个用例case when
,但想知道是否有替代解决方案。
我在进行聚类时遇到了电脑崩溃。计算机恢复后临时文件尚未清除。现在如何安全地清除它们?
更新
视窗操作系统。pgsql_tmp 目录为空,但磁盘空间仍被位于表基文件夹中的集群临时文件占用。
我试图从 PostgreSQL 12 docs中理解以下子句的含义
CLUSTER 可以使用指定索引上的索引扫描或(如果索引是 b 树)顺序扫描然后排序来重新排序表。
当使用顺序扫描和排序时,还会创建一个临时排序文件,因此峰值临时空间需求是表大小的两倍,加上索引大小。...您可以通过暂时将 enable_sort 设置为 off 来禁用此选择。
集群意味着基于索引信息对表进行物理重新编码。那么如果我设置会发生什么enable_sort=off
?它还能reoder
正确管理数据吗?如果是的话,那么enable_sort
在这里有选择权有什么好处呢?
假设有下表架构和数据
create table tbl(
id integer primary key,
name text,
pid integer
);
insert into tbl
values
(1,'d',0),
(2,'c',1),
(3,'b',1),
(4,'e',1),
(5,'b',0),
(6,'a',0);
它是父项和子项的一级深度层次结构。
我需要像这样将孩子的名字汇总到他们的父母中
id | name | children_names
----+------+------------
6 | a |
1 | d | c, e, b
5 | b |
children names
需要在每一行中排序,整个结果需要按name
列按字母顺序排序,但所有b
名称必须始终排在最后。
在 PostgreSQL 中,我会使用这样的row_number() over()
窗口函数
with
t as (select * from tbl order by name),
t2 as (select * from t where name<>'b' union all select * from t where name='b'),
t3 as (select *, row_number() over() from t2)
select a.id, a.name, string_agg(b.name, ', ' order by b.row_number)
from t3 a left join t3 b on a.id=b.pid and a.id<>b.id
where a.pid=0
group by a.id, a.name, a.row_number
order by a.row_number
但我需要在缺少窗口功能的 Android Room 中使用它。
那么如何在不使用窗口函数的情况下获得相同的结果呢?
假设我有下表架构和数据
create table categories(
id integer primary key,
parent_id integer
);
insert into categories
values
(1,0),
(2,0),
(3,1),
(4,1);
我需要计算每个条目的孩子数,即结果应该是
id | parent_id | count
----+-----------+-------
1 | 0 | 2
2 | 0 | 0
3 | 1 | 0
4 | 1 | 0
以下查询产生正确的结果,但我担心性能。我猜它循环遍历表的次数与其中的行数一样多。
select *, (select count(*) from categories b where a.id=b.parent_id) from categories a
有可能优化吗?
我有一个带有 id 和集群的 PostgreSQL 表,如下所示:
CREATE TABLE w (id bigint, clst int);
INSERT INTO w (id,clst)
VALUES
(1,0),
(1,4),
(2,1),
(2,2),
(2,3),
(3,2),
(4,2),
(5,4),
(6,5);
如果聚合按 id 分组的集群,可以看到集群数组中有重叠的值:
select id, array_agg(clst) clst from w group by id order by id;
id | clst
----+---------
1 | {0,4}
2 | {1,2,3}
3 | {2}
4 | {2}
5 | {4}
6 | {5}
即集群 4 涵盖 id 1 和 5,集群 2 涵盖 id 2、3 和 4,而集群 5 仅对应一个 id。
我现在如何聚合由集群数组重叠分组的 id?即预期的结果是:
id | clst
---------+-------
{1,5} | {0,4,4}
{2,3,4} | {1,2,3,2,2}
{6} | {5}
我不太关心集群列只需要正确聚合的 id。
可能的重叠数量没有限制。每个 id 的集群数量也不受限制(可以是数百甚至更多)。集群不按顺序关联到 id。
表中有数百万行!!!
使用 PostgreSQL 11。