标签: postgresql

访问 psql 从 bash 返回的列

我想在 bash 中使用 psql 返回的值。这是脚本:

psql "connection parameters" -c "SELECT pg_database_size('dbname');"
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

 pg_database_size 
------------------
          5773072
(1 row)
Run Code Online (Sandbox Code Playgroud)

但我只想要这样5773072我就可以在日志记录中使用它。有人可以帮忙吗?

postgresql psql

2
推荐指数
1
解决办法
6152
查看次数

Postgresql 嵌套 row_to_json 不起作用

如果我使用 postgresql 9.2,这可能不会成为问题,但是我(还)无法从 9.1 升级,并且我正在使用 9.1 的 json 数据类型扩展。我正在尝试实现如下所示的 json 对象:

[
  { "type": "add"
    , "id":"285947086237736960"
    , "version" : 1
    , "lang":"en"
    ,"fields":  {
        "id" : "285947086237736960"
        , "created_at":"2013-01-01"
        , "content":"bla bla blah LOL ROFL"
    }
  }, ...
]
Run Code Online (Sandbox Code Playgroud)

嵌套的“fields”属性来自名为“tweets”的数据库表。两个 id 来自同一个表。但是,类型、版本、语言始终相同。我查看了/sf/ask/925899971/的建议,其中提到使用别名子查询表达式。这根本不起作用,我仍然得到 f1、f2 等。使用 row_to_json 创建 JSON 时将名称设置为属性的建议适用于单个级别,但我无法让它适用于嵌套“字段” “ 属性。

据我所知,这只适用于类似于以下的 with 语句:

with tweets(type, id) as ( 
    select 'add' as type, tweets.id from tweets 
) select row_to_json(tweets) from tweets;
Run Code Online (Sandbox Code Playgroud)

但是,如何获得嵌套的“字段”?任何帮助是极大的赞赏!

postgresql subquery postgresql-9.1

2
推荐指数
1
解决办法
4167
查看次数

如何在 PostgreSQL 存储过程中生成以毫秒为单位的时间?

我一直在阅读有关时间戳的 Postgres 文档,但我仍然有点困惑。

我需要存储当前时间和 1970 年 1 月 1 日午夜之间的时刻(以毫秒为单位)(类似于Java中定义的时刻,但我没有使用 Java)。

如果我正确阅读文档,我相信我必须使用CURRENT_TIMESTAMP,因为它包含时区。正确的?

有人可以解释如何创建一个存储过程,将该时间戳转换为我想要的毫秒(以及反向函数)吗?

动机:我知道在选择行时可以使用类似EXTRACTon的东西CURRENT_TIMESTAMP,但这种转换比以毫秒为单位存储时间更昂贵。我准备将我的时刻存储到bigint. 比较时刻或计算时间差会更快。

postgresql stored-procedures timestamp

2
推荐指数
1
解决办法
1万
查看次数

Postgres 内存使用率太低

我有一个 400GB 的内存Postgres 9.3.4 DB在运行Fedora20,每个表都有一些索引。我已将共享缓冲区提高到 4GB(系统有 16GB 可用),在内核中设置 shm 并将 设为effective_cache_size12GB。work_mem是 60MB

然后我每秒对数据库运行数百个查询很长一段时间。我的整个系统(带操作系统)仅使用 3GB RAM 并且没有交换。

Postgres并没有真正使用它可能使用的 RAM,我宁愿最大化我的 RAM 并获得查询/索引性能(如果可能)。

我是否缺少一些配置方面的知识?

postgresql linux memory

2
推荐指数
1
解决办法
3866
查看次数

从 Postgres 中的文本列解析 JSON 数据

我有JSON一个文件如下:

[xyz@innolx20122 ~]$ cat cgs_test.json
{"technology":"AAA","vendor":"XXX","name":"RBNI","temporal_unit":"hour","regional_unit":"cell","dataset_metadata":"{\"name\": \"RBNI\", \"temporal_unit\": \"hour\", \"technology\": \"LTE\", \"is_dimension\": false, \"timestamp_column_pattern\": \"yyyyMMddHHmmss\", \"data_type\": \"PM\", \"source_name\": \"RBNI\", \"intervals_epoch_seconds\": [[1609941600, 1609945200]], \"identifier_column_names\": [\"CELLID\", \"CELLNAME\", \"radio_frequency_band\", \"ENODEBID\", \"ENODEBNAME\", \"SBNID\", \"SITEID\", \"SITENAME\", \"CLUSTER_PRIORITY\", \"CP_SITE\", \"IBC\", \"NETWORK_TIER\", \"SITE_TYPE\", \"T3_FLAG\", \"CLUSTERID\", \"CLUSTERNAME\", \"REGION\", \"NETWORK\"], \"vendor\": \"ZTE\", \"timestamp_column_name\": \"COLLECTTIME\", \"regional_unit\": \"cell\"}","rk":1}
{"technology":"AAA","vendor":"XXX","name":"RRCADD","temporal_unit":"hour","regional_unit":"cell","dataset_metadata":"{\"name\": \"RRCADD\", \"temporal_unit\": \"hour\", \"technology\": \"AAA\", \"is_dimension\": false, \"timestamp_column_pattern\": \"yyyyMMddHHmmss\", \"data_type\": \"PM\", \"source_name\": \"RRCADD\", \"intervals_epoch_seconds\": [[1609941600, 1609945200]], \"identifier_column_names\": [\"CELLID\", \"CELLNAME\", \"radio_frequency_band\", \"ENODEBID\", \"ENODEBNAME\", \"SBNID\", \"SITEID\", \"SITENAME\", \"CLUSTER_PRIORITY\", \"CP_SITE\", \"IBC\", \"NETWORK_TIER\", \"SITE_TYPE\", …
Run Code Online (Sandbox Code Playgroud)

postgresql

2
推荐指数
1
解决办法
852
查看次数

计算每个值的重复项

我需要在我的表中添加一列,其中包含每次出现的次数。因此,如果值是唯一的,则列值应为 1,但如果有多个副本,我需要为每一行 (1,2...) 设置一个不同的值

例如,数据库是 postgres

ID 价值 数数
1 一种 1
2 一种 2
3 1
4 2
5 3
6 C 1

数据库示例https://dbfiddle.uk/?rdbms=postgres_10&fiddle=0e7132f3f094bd93b390ccae2e811696

postgresql

2
推荐指数
1
解决办法
86
查看次数

如何创建需要一定时间执行的查询?

我已经statement_timeout=1000在 Postgres DB 中配置了

我正在使用来自 Java 应用程序的 JDBC 驱动程序访问数据库表。如果语句超时,JDBC 驱动程序将抛出异​​常。如果抛出异常,我有一个将被执行的逻辑。

现在我想测试这个功能,有没有办法让查询在1000毫秒内不返回结果?

postgresql

2
推荐指数
1
解决办法
42
查看次数

从一个表中选择一行,如果不存在,从另一个表中选择

如何从一个表中选择一行,但如果它不存在,则回退到从辅助表中选择它?这是我想要实现的简化版本

create table table_1 (
  person TEXT,
  favourite_number INT
  );
  
  create table table_2 (
    person TEXT,
    favourite_number INT
  );
  
  insert into table_1 (person, favourite_number) values 
  ('Bob', 1),
  ('Fred', 2)
  ;
  
    insert into table_2 (person, favourite_number) values 
  ('Bob', 30),
  ('Alice', 70)
  ;
Run Code Online (Sandbox Code Playgroud)

我想得到以下结果:

| person | favourite_number |
|--------|------------------|
| Bob    | 1                |
| Alice  | 70               |
| Fred   | 2                |
Run Code Online (Sandbox Code Playgroud)

注意它如何从第一个表中选择 Bob 和 Fred。即使鲍勃出现在第二张桌子上,因为我们已经拿到了他,我们还是把他从第一张桌子上拿走了。Alice 只出现在第二个表中。

到目前为止,这是我尝试过的,但我无法让所有 3 个返回,请帮助。

select
  t1.*
from table_1 t1
where t1.person not in …
Run Code Online (Sandbox Code Playgroud)

postgresql select postgresql-9.6

2
推荐指数
1
解决办法
281
查看次数

将元数据附加到存储过程

是否可以将元数据附加到 Postgres 11 中的存储过程?

特别是,我有带有版本号的数据库迁移。因此,当我的迁移脚本运行并可能用 覆盖当前存储的过程时CREATE OR REPLACE PROCEDURE,我希望能够使用更新的版本号将元数据附加到存储过程。

另外,这之后如何查询?

postgresql

2
推荐指数
1
解决办法
36
查看次数

如何使用 PostgreSQL 更改层次结构树中的字符串输出?

我有一张这样的表:

-------------------------------------------------
|  id  | description         | parent_id   |  cost
--------------------------------------------------
| 1    |  Radiology         |       NULL  | 0.00
| 2    |  Lab Tests         |       NULL  | 0.00
| 3    |  Normal Radiology  |         1   | 0.00
| 4    |  Resonance         |         1   | 100.00
| 1100 |  Cerebral Resonance|         4   | 200.00
| 1900 |  Blood Tests       |         2   | 10.00
| 2044 |  Calcium           |         2   | 50.00

---------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我需要生成这种输出:

Radiology
   -->Normal Radiology
   -->Resonance
      -->Cerebral Resonance with contrast …
Run Code Online (Sandbox Code Playgroud)

postgresql cte recursive string-manipulation

2
推荐指数
1
解决办法
158
查看次数