我在PostgreSQL 9.3数据库上有一个物化视图,该数据库很少发生变化(大约每天两次).但是当它发生时,我想及时更新其数据.
以下是我到目前为止的想法:
有一个物化视图mat_view,它从表中获取数据table1并table2使用一些连接语句.
无论何时进入table1或table2更改,我已经有一个触发器更新一个config由...组成的配置表
table_name | mat_view_name | need_update
-----------+---------------+------------
table1 | mat_view | TRUE/FALSE
table2 | mat_view | TRUE/FALSE
Run Code Online (Sandbox Code Playgroud)
因此,如果有任何table1更改(每个语句的UPDATE和DELETE都有触发器),need_update则第一行中的字段设置为TRUE.同样适用table2于第二行.
显然,如果need_update为TRUE,则必须刷新实体化视图.
更新:由于物化视图不支持规则(如下面评论中提到的@pozs),我会更进一步.我创建了一个v_mat_view带有定义" SELECT * FROM mat_view" 的虚拟视图.当用户在此视图上执行SELECT时,我需要创建一个ON SELECT规则,它执行以下操作:
mat_view应该更新(SELECT 1 FROM config WHERE mat_view_name='mat_view' AND need_update=TRUE)need_update标志UPDATE config SET need_update=FALSE where mat_view_name='mat_view'REFRESH MATERIALIZED VIEW …我想在PostgreSQL数据库中获取两个日期(包括它们)之间的日期列表.例如,如果我有:
那么结果应该是:
29 june 2012
30 june 2012
1 july 2012
2 july 2012
3 july 2012
Run Code Online (Sandbox Code Playgroud)
在PostgreSQL中执行此操作的最佳方法是什么?
谢谢.
我想在分组时将两列聚合成一个"数组".
假设一个像这样的表:
friends_map:
=================================
user_id friend_id confirmed
=================================
1 2 true
1 3 false
2 1 true
2 3 true
1 4 false
Run Code Online (Sandbox Code Playgroud)
我想从user_id中选择此表和group并获取friend_id并确认为以逗号分隔的连接值.
目前我有这个:
SELECT user_id, array_agg(friend_id) as friends, array_agg(confirmed) as confirmed
FROM friend_map
WHERE user_id = 1
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
这让我:
=================================
user_id friends confirmed
=================================
1 [2,3,4] [t, f, f]
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到:
=================================
user_id friends
=================================
1 [ [2,t], [3,f], [4,f] ]
Run Code Online (Sandbox Code Playgroud) 如何编写和执行使用libpqxx插入数组值的查询?
INSERT INTO exampleTable(exampleArray[3]) VALUES('{1, 2, 3}');
Run Code Online (Sandbox Code Playgroud)
这个示例代码给了我:
ERROR: syntax error at or near "'"
Run Code Online (Sandbox Code Playgroud)
怎么了?在PostgreSQL文档中,我发现:
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
Run Code Online (Sandbox Code Playgroud)
...
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}');
Run Code Online (Sandbox Code Playgroud) 我可以成功创建一个函数如下:
CREATE FUNCTION Foo(MY_Value INT) RETURNS INT
AS 'SELECT 2 + MY_Value'
LANGUAGE SQL
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先要检查函数是否存在然后删除它,那么我必须指定以下内容:
DROP FUNCTION IF EXISTS Foo(My_Value INT);
Run Code Online (Sandbox Code Playgroud)
在不指定输入参数的情况下,以下内容返回错误,指出"NOTICE:function foo()不存在,跳过"
DROP FUNCTION IF EXISTS Foo();
Run Code Online (Sandbox Code Playgroud)
与MySQL类似,有没有办法在PostgreSQL中删除FUNCTION而无需为函数指定参数?换句话说,在MySQL语句中是否存在以下等价物(即,在不指定输入参数的情况下删除存储过程)?
DROP PROCEDURE IF EXISTS Foo;
Run Code Online (Sandbox Code Playgroud) 在postgresql 9.5中,有没有办法在jsonb字段中重命名属性?
例如:
{ "nme" : "test" }
Run Code Online (Sandbox Code Playgroud)
应该重命名为
{ "name" : "test"}
Run Code Online (Sandbox Code Playgroud) 当我尝试从表中选择一些记录时
SELECT * FROM movie_test WHERE tags = ('["dramatic","women", "political"]'::json)
Run Code Online (Sandbox Code Playgroud)
sql代码抛出错误
LINE 1: SELECT * FROM movie_test WHERE tags = ('["dramatic","women",...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
********** ?? **********
ERROR: operator does not exist: json = json
SQL ??: 42883
????:No operator matches the given name and argument type(s). You might need to add explicit type casts.
??:37
Run Code Online (Sandbox Code Playgroud)
我错过了什么或者我可以在哪里了解这个错误.
我必须通过调整基本的PostgreSQL服务器配置参数来优化查询.在文档中,我遇到了work_mem参数.然后我检查了如何更改此参数会影响我的查询的性能(使用sort).我用各种work_mem设置测量了查询执行时间,非常失望.
我执行查询的表包含10,000,000行,并且有430 MB的数据要排序.(Sort Method: external merge Disk: 430112kB).
用work_mem = 1MB,EXPLAIN输出是:
Total runtime: 29950.571 ms (sort takes about 19300 ms).
Sort (cost=4032588.78..4082588.66 rows=19999954 width=8)
(actual time=22577.149..26424.951 rows=20000000 loops=1)
Sort Key: "*SELECT* 1".n
Sort Method: external merge Disk: 430104kB
Run Code Online (Sandbox Code Playgroud)
用work_mem = 5MB:
Total runtime: 36282.729 ms (sort: 25400 ms).
Sort (cost=3485713.78..3535713.66 rows=19999954 width=8)
(actual time=25062.383..33246.561 rows=20000000 loops=1)
Sort Key: "*SELECT* 1".n
Sort Method: external merge Disk: 430104kB
Run Code Online (Sandbox Code Playgroud)
用work_mem …
在下面的查询中,$ isComplete和$ isValid作为字符串返回.但是,它们保存为布尔值.如何获取要返回的这些字段的布尔表示?
query =
"SELECT
data #>> '{id}' AS id,
data #>> '{name}' AS name,
data #>> '{curator}' AS curator,
data #> '{$isValid}' as \"$isValid\",
data #> '{customer}' as customer,
data #> '{$createdTS}' as \"$createdTS\",
data #> '{$updatedTS}' as \"$updatedTS\",
data #> '{$isComplete}' as \"$isComplete\",
(count(keys))::numeric as \"numProducts\"
FROM
appointment_intakes,
LATERAL jsonb_object_keys(data #> '{products}') keys
GROUP BY id"
Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL 9.6,我有一个名为"ItemDbModel"的表,其中有两列如下:
No integer,
Content jsonb
Run Code Online (Sandbox Code Playgroud)
说我把很多记录像:
"No": 2, {"obj":"x","Item": {"Name": "BigDog", "Model": "NamedHusky", "Spec":"red dog"}}
"No": 4, {"obj":"x","Item": {"Name": "MidDog", "Model": "NamedPeppy", "Spec":"no hair"}}
"No": 5, {"obj":"x","Item": {"Name": "BigCat", "Model": "TomCat", "Spec":"blue color"}}
Run Code Online (Sandbox Code Playgroud)
如何查询表格:
并按"Content.Item.Name.length"排序?
谢谢!