Postgres приведен к UUID из JSON - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть две очень простые таблицы sessions, в которых есть столбец json, например:

+----+-------------------------------------------------------+
| id |                         data                          |
+----+-------------------------------------------------------+
|  1 | { "user_id": "bc2166dd-ca1d-41c6-9c66-610f844ca139" } |
+----+-------------------------------------------------------+

А также таблица users, например:

+--------------------------------------+--------------------+
|                  id                  |       email        |
+--------------------------------------+--------------------+
| bc2166dd-ca1d-41c6-9c66-610f844ca139 | foobar@example.com |
+--------------------------------------+--------------------+

Есть ли способ присоединиться к содержимому типа столбца json, как этот?

with recursive active_sessions AS (
  select
  data->'users_id' as sid
  from sessions
)

select *
from active_sessions
join users ON active_sessions.sid = users.id
where sid is not null;

В моих основных попытках я застрял и не могу заставить текст json быть в состояниипри соединении я получаю эту ошибку:

[22P02] ERROR: invalid input syntax for uuid: ""bc2166dd-ca1d-41c6-9c66-610f844ca139""

обратите внимание на двойные кавычки ...?

Я также пытался привести user_id ввыбор вроде (data->'user_id')::uuid но без везения.

1 Ответ

0 голосов
/ 01 декабря 2018

Проблема в том, что оператор -> возвращает JSON, поэтому вы возвращаете строку с кавычками как часть строки вместо ожидаемой строки.Подробности см. В https://www.postgresql.org/docs/9.5/functions-json.html.

. Вместо этого вы должны использовать оператор - >>, поскольку он будет возвращать целое или текстовое значение.Возвращенный текст не будет включать кавычки.Затем вы можете преобразовать текст в uuid, и Postgres распознает его.

SQL Fiddle: http://sqlfiddle.com/#!17/d9e06/3/0

create table sessions (id integer, data json);
insert into sessions values(1, ' { "user_id": "bc2166dd-ca1d-41c6-9c66-610f844ca139" }');
create table users (id uuid, email text);
insert into users values('bc2166dd-ca1d-41c6-9c66-610f844ca139','a@b.com');

--query using ->> operator to return an integer or text instead of JSON
select (data->>'user_id')::uuid 
, * 
from sessions 
join users on (data->>'user_id')::uuid = users.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...