Как сделать запрос на основе значения объекта?

У меня есть таблица базы данных crate с записями, подобными приведенной ниже:

  {
    "businessareaname": "test",
    "profile": {
      "phone": "",
      "fullname": "",
      "email": "[email protected]"
    }
  }

Я пробовал запрашивать с помощью:

select * 
from myTable 
where profile['email'] = '[email protected]';

но ничего не возвращается. Как я могу получить записи на основе значения электронной почты, которое находится в объекте?

Это не плоская таблица, так что это моя лучшая попытка показать структуру таблицы. Первая строка — заголовок, а следующие две строки — данные.

    business name | profile:
                    - phone
                    - fullname
                    - email
    -------------------------------------
    "test"       | ""
                   ""
                   "[email protected]"
   -------------------------------------
    "other one"  | "(415)884-9938"
                   "Abe Miessler"
                   "[email protected]"

person Abe Miessler    schedule 08.11.2017    source источник
comment
Не могли бы вы показать структуру таблицы, пожалуйста?   -  person Jorge Campos    schedule 08.11.2017
comment
@JorgeCampos - конечно, я приложил все усилия. Это сложно сделать, так как это не плоский стол, поэтому дайте мне знать, если вы все еще запутались. Первая строка — заголовок. Следующие две строки — данные   -  person Abe Miessler    schedule 08.11.2017
comment
Можешь попробовать ...where unnest( profile,['email']) = '[email protected]';   -  person Jorge Campos    schedule 08.11.2017
comment
Выдал ошибку: SQLActionException[UnsupportedFeatureException: unknown function: unnest(object, string_array)]   -  person Abe Miessler    schedule 08.11.2017
comment
На странице документации нет ничего полезного. Лучшее, что я смог найти, касалось типов объектов в разделе JDBC (crate.io/docs/clients/jdbc/en/latest/#types) там Crate Object сопоставляется с типом json PostgreSql, что означает, что ... where profile->>'email'='[email protected]' или что-то близкое к нему должно работать. См. это здесь, в документе postgresql: postgresql.org/docs/9.3/ статический/функции-json.html   -  person Jorge Campos    schedule 09.11.2017
comment
Я только что разговаривал с техническим директором Crate, и он сказал мне, что мне не повезло, пока их инженеры не разберутся в этом. Немного разочарован продуктом - это действительно неудобно :-(   -  person Abe Miessler    schedule 09.11.2017
comment
Hoooly cr$%¨& .... точно... выпускать тип без возможности использовать его в запросе, какой бардак... :(   -  person Jorge Campos    schedule 09.11.2017


Ответы (1)


Пример, который вы написали, должен работать и является правильным.

Причина, по которой это может не работать, заключается в том, что схема таблицы неверна, а именно:

  • Столбец электронной почты был создан с помощью INDEX OFF
  • Столбец объекта был создан с типом столбца IGNORED
  • В столбце электронной почты есть полнотекстовый индекс/анализатор, поэтому электронная почта токенизирована.

Вот полный рабочий пример:

create table t1 (profile object as (email string));

insert into t1 (profile) values ({email='[email protected]'});

refresh table t1;

select * from t1 where profile['email'] = '[email protected]';

Если передать в crash, это выведет:

CONNECT OK
CREATE OK, 1 row affected  (0.286 sec)
INSERT OK, 1 row affected  (0.082 sec)
REFRESH OK, 1 row affected  (0.065 sec)
+-----------------------------------+
| profile                           |
+-----------------------------------+
| {"email": "[email protected]"} |
+-----------------------------------+
SELECT 1 row in set (0.087 sec)
person mfussenegger    schedule 08.11.2017
comment
Спасибо за информацию. Я просмотрел детали таблицы и обнаружил, что столбец электронной почты был создан с помощью: STRING INDEX USING FULLTEXT WITH (analyzer = 'standard' ) столбец объекта был создан как OBJECT (DYNAMIC) . С этими настройками три пункта, которые вы упомянули, не должны быть фактором - верно? - person Abe Miessler; 09.11.2017
comment
STRING INDEX USING FULLTEXT WITH (analyzer = 'standard' ) - это именно то, на что ссылается третий пункт. Поскольку значения теперь токенизированы, вы можете запросить с помощью where profile['email'] = 'abe' или с помощью where profile['email'] = 'spatially.com' - person mfussenegger; 09.11.2017