2017-01-17 6 views
1

У меня есть JSON в моем Postgres БД, это в таблице под названием site_content, таблица имеет два ряда, id и content, в content где я храню JSON. Я хочу, чтобы найти игрока с его идентификатором, мои игроки хранятся под ключом series, так как это ключ, необходимый для создания моих диаграмм от JSON.запрос JSON в Postgres

Вот запрос я в настоящее время с помощью:

Blocking.get { 
       sql.firstRow("""SELECT * from site_content where content -> 'playersContainer' -> 'series' -> 'id' = ${id} """) 
      }.map { row -> 
       log.info("row is: ${row}") 
       if (row) { 
        objectMapper.readValue(row.getAt(0).toString(), Player) 
       } 
      } 
     } 

Однако я получаю обратно эту ошибку:

org.postgresql.util.PSQLException: ERROR: operator does not exist: json = character varying Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Вот пример моего JSON:

"id": "${ID}", 
    "team": { 
     "id": "123", 
     "name": "Shire Soldiers" 
    }, 
    "playersContainer": { 
     "series": [ 
      { 
       "id": "1", 
       "name": "Nick", 
       "teamName": "Shire Soldiers", 
       "ratings": [ 
        1, 
        5, 
        6, 
        9 
       ], 
       "assists": 17, 
       "manOfTheMatches": 20, 
       "cleanSheets": 1, 
       "data": [ 
        3, 
        2, 
        3, 
        5, 
        6 
       ], 
       "totalGoals": 19 
      }, 
      { 
       "id": "2", 
       "name": "Pasty", 
       "teamName": "Shire Soldiers", 
       "ratings": [ 
        6, 
        8, 
        9, 
        10 
       ], 
       "assists": 25, 
       "manOfTheMatches": 32, 
       "cleanSheets": 2, 
       "data": [ 
        3, 
        5, 
        7, 
        9, 
        10 
       ], 
       "totalGoals": 24 
      } 
     ] 
    } 

I я использую Groovy для этого проекта, но я думаю, что это просто общий синтаксис postgres JSON, с которым у меня возникают проблемы.

ответ

2

Вы правы, это проблема с синтаксисом SQL. Исправьте вы запрашиваете:

select * from json_test where content->'playersContainer'->'series' @> '[{"id":"1"}]'; 

Полный пример:

CREATE TABLE json_test (
    content jsonb 
); 

insert into json_test(content) VALUES ('{"id": "1", 
    "team": { 
     "id": "123", 
     "name": "Shire Soldiers" 
    }, 
    "playersContainer": { 
     "series": [ 
     { 
      "id": "1", 
      "name": "Nick", 
      "teamName": "Shire Soldiers", 
      "ratings": [ 
      1, 
      5, 
      6, 
      9 
      ], 
      "assists": 17, 
      "manOfTheMatches": 20, 
      "cleanSheets": 1, 
      "data": [ 
      3, 
      2, 
      3, 
      5, 
      6 
      ], 
      "totalGoals": 19 
     }, 
     { 
      "id": "2", 
      "name": "Pasty", 
      "teamName": "Shire Soldiers", 
      "ratings": [ 
      6, 
      8, 
      9, 
      10 
      ], 
      "assists": 25, 
      "manOfTheMatches": 32, 
      "cleanSheets": 2, 
      "data": [ 
      3, 
      5, 
      7, 
      9, 
      10 
      ], 
      "totalGoals": 24 
     } 
     ] 
    }}'); 

select * from json_test where content->'playersContainer'->'series' @> '[{"id":"1"}]'; 

@> О оператора. Это может быть полезно и для question.

+0

Спасибо за ответ но я получаю эту ошибку ОШИБКА: оператор не существует: @ JSON> неизвестно –

+0

Я использую Postgres 9,4 –

+0

я бросил мое содержание jsonb вместо JSON и он работал, спасибо! –

Смежные вопросы