代码之家  ›  专栏  ›  技术社区  ›  JP Silvashy Gautam Rege

从json转换为uuid的postgres

  •  0
  • JP Silvashy Gautam Rege  · 技术社区  · 6 年前

    我有两张很简单的桌子 sessions 哪个有 json 像这样的列:

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

    还有一个 users 像这样的桌子:

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

    有没有办法加入 杰森 像这样的列类型?

    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 回复  |  直到 6 年前
        1
  •  5
  •   George S    6 年前

    问题是->运算符返回json,这就是为什么要返回一个字符串,并将引号作为字符串的一部分,而不是预期的字符串。详见 https://www.postgresql.org/docs/9.5/functions-json.html .

    您应该改用->>运算符,因为它将返回整数或文本值。返回的文本将不包含引号。然后,您可以将文本转换为uuid,postgres将识别它。

    SQL小提琴: 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;