我有下表,我想要其 userid='user-1' 和 gridname='RT' 的布局名称
| userid | defaultdata |
|--------|------------------------------------------------------------------------------------------|
| user-1 | [{"gridname":"RT", "layoutname":"layout-1"},{"gridname":"RT2", "layoutname":"layout-2"}] |
| user-2 | [{"gridname":"RT", "layoutname":"layout-3"},{"gridname":"RT2", "layoutname":"layout-2"}] |
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试过这个。
SELECT userid, obj.value->>'gridname' AS gridname
FROM col.userdefault t
JOIN lateral jsonb_array_elements(t.defaultdata::jsonb) obj(value) ON
obj.value->>'_gridname' = 'RT'
WHERE defaultdata @> '[{"_gridname":"RT"}]';
Run Code Online (Sandbox Code Playgroud)
但不工作并收到以下错误:
ERROR: operator does not exist: json @> unknown
LINE 4: WHERE defaultdata @> '[{"_gridname":"RT"}]::jsonb';
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 198
Run Code Online (Sandbox Code Playgroud)
该@>运营商不存在json,只为jsonb。
您可以使用显式类型转换摆脱即时错误,如错误消息所示:
WHERE defaultdata::jsonb @> '...'
Run Code Online (Sandbox Code Playgroud)
不过,看得更远,我想知道是否json适合您的数据类型。对于要在数据库内部有效操作的数据,jsonb更好。