在示例表中:
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” … |
假设我有一个表“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) 我有一个表 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)