当我有一个具有分隔值的列时,我可以使用该unnest()函数:
myTable
id | elements
---+------------
1 |ab,cd,efg,hi
2 |jk,lm,no,pq
3 |rstuv,wxyz
select id, unnest(string_to_array(elements, ',')) AS elem
from myTable
id | elem
---+-----
1 | ab
1 | cd
1 | efg
1 | hi
2 | jk
...
Run Code Online (Sandbox Code Playgroud)
我如何包含元素编号?即:
id | elem | nr
---+------+---
1 | ab | 1
1 | cd | 2
1 | efg | 3
1 | hi | 4
2 | jk | 1
...
Run Code Online (Sandbox Code Playgroud)
我想要源字符串中每个元素的原始位置.我试着窗口函数(row_number(), …
sql arrays postgresql window-functions set-returning-functions
我有一个Rails模型,它有一个类型为"json"的数据库列:
create_table "games", force: true do |t|
t.json "game_board"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Run Code Online (Sandbox Code Playgroud)
大!现在我该如何使用它?它真的像处理这样的领域一样Hash简单吗?
self.game_board[:player1] = 1
self.game_board[:cards] = cards.to_hash
Run Code Online (Sandbox Code Playgroud)
如果我写这个,那么一切都会按预期工作,所以在未来的客户API调用中我可以这样做吗?:
self.game_board[:player] # And get back the 1 that I put here before
Run Code Online (Sandbox Code Playgroud)
性能如何呢?game_board即使从未读过该字段,每次都会对整个序列进行反序列化吗?每当我改变"Hash"的一部分时,是否会重写该字段(IOW是数据库写入)
我已经在 StackOverflow 上看到了一些对此问题的其他回答,但没有一个对我有用。
{
"data": {
"list": [
{"id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1"},
{"id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3"},
{"id": "b98958fa-87c4-4dcc-aa84-beaf2b32c5c0", "type": "type1"},
{"id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"},
{"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"},
{"id": "0f7f4ced-61c2-45da-b15c-0e12058f66a7", "type": "type4"}
]
}
}
Run Code Online (Sandbox Code Playgroud)
这个 Json 存储在一个名为“questions”的字段中,现在我想在该表中查询列表中具有特定 id 的对象。所以说我有 id 555816da-4547-4a82-9e7e-1e92515bd82b,我想返回
{"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"}
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到的解决方案(主要是在这里),但没有起作用,如下:
SELECT questions->'data'->'list'
FROM assignments
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c'
AND questions->'data'->'list' @> '[{"id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"}]';
Run Code Online (Sandbox Code Playgroud)
我已经在多个不同的响应中看到了这个解决方案,但它根本没有缩小数组范围,它每次都返回完整的内容。where 子句中的第一个 id 是我想要的特定赋值对象的 id,它在这里基本上不相关。
SELECT questions->'data'->'list'
FROM assignments
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c'
AND questions->'data'->'list' @> '[{"id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"}]';
Run Code Online (Sandbox Code Playgroud)
这不会返回任何内容。
有谁知道如何轻松地做到这一点?