小编Zeg*_*rek的帖子

PostgreSQL jsonb_path_query 删除结果而不是返回空值

在示例表中:

CREATE TABLE example (
    id   SERIAL PRIMARY KEY,
    data JSON NOT NULL );
INSERT INTO example (id, data) VALUES
  (1, '[{"key": "1", "value": "val1"}, {"key": "2", "value": "val2"}]')
, (2, '[{"key": "1", "value": "val1"}]')
, (3, '[{"key": "1", "value": "val1"}, {"key": "2", "value": "val2"}]');
Run Code Online (Sandbox Code Playgroud)

我想查询数据列中 key = 2 的值字段。我当前使用的查询是这样的:

SELECT id,
       jsonb_path_query(
               TO_JSONB(data),
               '$[*] ? (@.key == "2").value'::JSONPATH
           )::VARCHAR AS values
FROM example
Run Code Online (Sandbox Code Playgroud)

我期望结果是:

ID 价值观
1 “值2”
2 无效的
3 “值2”

但实际结果是:

ID 价值观
1 “值2”
3 “值2” …

sql postgresql jsonpath set-returning-functions jsonb

5
推荐指数
2
解决办法
1283
查看次数

在 gorm 中,如何转义 postgres 中的 '?` 运算符?

假设我有一个表“testing”,其中有一列“agents”,类型jsonb为存储代理名称数组

> SELECT * FROM testing;
+--------------------------------------+---------------------+
| id                                   | agents              |
|--------------------------------------+---------------------|
| 018d17a4-5418-1f87-f702-3ed8325f4d11 | ["mikel", "arsene"] |
+--------------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

我可以使用?运算符来查找将字符串作为代理之一的记录。

> SELECT * FROM testing WHERE agents ? 'mikel'
+--------------------------------------+---------------------+
| id                                   | agents              |
|--------------------------------------+---------------------|
| 018d17a4-5418-1f87-f702-3ed8325f4d11 | ["mikel", "arsene"] |
+--------------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

然而,在 gorm 中,?也充当占位符。所以我无法将查询形成为

> SELECT * FROM testing;
+--------------------------------------+---------------------+
| id                                   | agents              |
|--------------------------------------+---------------------|
| 018d17a4-5418-1f87-f702-3ed8325f4d11 | ["mikel", "arsene"] |
+--------------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

将产生原始查询

> SELECT * FROM testing WHERE agents …
Run Code Online (Sandbox Code Playgroud)

postgresql go jsonb go-gorm

5
推荐指数
0
解决办法
118
查看次数

在 PostgreSQL 中将计算出的负值替换为 0

我有一个表 my_table:

case_id    first_created  last_paid       submitted_time
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00
   1245    2021-09-13     None            2022-10-31 02:03:59.620348+00:00
   9073    None           None            2021-09-12 10:25:30.845687+00:00
   6891    2021-08-03     2021-09-17      None
Run Code Online (Sandbox Code Playgroud)

我创建了 2 个新变量:

case_id    first_created  last_paid       submitted_time
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00
   1245    2021-09-13     None            2022-10-31 02:03:59.620348+00:00
   9073    None           None            2021-09-12 10:25:30.845687+00:00
   6891    2021-08-03     2021-09-17      None
Run Code Online (Sandbox Code Playgroud)

输出:

  case_id    first_created  last_paid       submitted_time               create_duration paid_duration
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00     1                3
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00 …
Run Code Online (Sandbox Code Playgroud)

postgresql

3
推荐指数
1
解决办法
2101
查看次数