2015-03-14 3 views
3

Может ли кто-нибудь помочь мне найти внутри json-тип данных базы данных Postgres.Поиск и выбор данных Postgres NOSQL/json

У меня есть одна таблица говорят transactions и содержит следующие как значения массива:

column: "data" datatype: json

Одно демо сделка:

{ 
    "id": "tran_54645bcb98ba7acfe204", 
    "amount": 4200, 
    ... 
    "fees": [ 
     { 
      "type": "application", 
      "application": "app_1d70acbf80c8c35ce83680715c06be0d15c06be0d", 
      "payment": "pay_917018675b21ca03c4fb", 
      "amount": 420, 
      "currency": "EUR", 
      "billed_at": null 
     } 
    ] 
} 

Вложенный список транзакций:

[ 
    { 
     "id": "tran_54645bcb98ba7acfe204", 
     "amount": 4200, 
     "fees": [ 
      { 
       "type": "application", 
       "application": "app_1d70acbf80c8c35ce83680715c06be0d15c06be0d", 
       "payment": "pay_917018675b21ca03c4fb", 
       "amount": 420, 
       "currency": "EUR", 
       "billed_at": null 
      } 
     ] 
    }, 
    { 
     "id": "tran_98645bcb98ba7acfe204", 
     "amount": 4200, 
     "fees": [ 
      { 
       "type": "application", 
       "application": "app_1d70acbf80c8c35ce83680715c06be0d15c06be0d", 
       "payment": "pay_917018675b21ca03c4fb", 
       "amount": 120, 
       "currency": "AUD", 
       "billed_at": null 
      } 
     ] 
    } 
] 

If I хочу получить все t ransactions с amount > 300 И также с currency = EUR как я могу их получить? Я новичок в Postgres так нужна помощь в понимании построения запросов для Postgres NoSQL специально с PHP

+1

Версия для Postgres? Определение таблицы? Кроме того, нет такой вещи, как «postgre». [Сокращенное название PostgreSQL - Postgres.] (Https://wiki.postgresql.org/wiki/Identity_Guidelines). Исправьте. –

+0

У меня есть версия 9.4 Вы можете рассмотреть определение таблицы следующим образом: 'table name: transaction columns: data' – mukund

+1

Итак, вы используете' json', а не 'jsonb'? Последнее [может быть хорошей идеей] (http://stackoverflow.com/questions/10560394/how-do-i-query-using-fields-inside-the-new-postgresql-json-datatype/10560761#10560761) , –

ответ

4

Для просто одного элемента в гнездовой массив JSON:

SELECT * 
FROM transactions 
WHERE (data #>> '{fees,0,amount}')::numeric > '300' 
AND (data #>> '{fees,0,currency}') = 'EUR'; 

Для массивов с большим количеством элементов, которые необходимо делать больше.
Руководство по эксплуатации JSON Functions and Operators.

Поскольку вы используете Postgres 9.4: С jsonb было бы улучшенные варианты, в частности, для нескольких элементов массива:

Чтобы получить сумму, которую вы просите для комментариев нет:

SELECT sum((data #>> '{fees,0,amount}')::numeric) AS sum_amount 
FROM ... 
+0

Спасибо за ее работу. – mukund

+0

Еще один вопрос: могу ли я получить совокупный SUM (сумма) для всей суммы> 300 в соответствии с приведенным выше запросом – mukund