Удалить вложенные поля, где значение равно X в BigQuery - PullRequest
0 голосов
/ 06 марта 2020

Итак, у меня есть коллекция животных, которая выглядит примерно так:

{ "collection":
  [
      {   "name":"cow",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"sheep",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"goat",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"dog",
      "parts": [
          {"part_name":"ears"},
          {"part_name":"nipples"},
          {"part_name":"legs"},
          {"part_name":"nostrils"}
      ]
      }
  ]
}

Мне не нравится part_name "rumen", поэтому я хочу написать оператор удаления, который удаляет только вложенные поля где значение равно "rumen", ie:

delete from animals where parts.part_name = 'rumen';

Но это не способ go об этом. Как мне этого добиться?

РЕДАКТИРОВАТЬ: объяснение таблицы животных (части повторяются):

|   animal_name   |            parts.part_name           |
+-----------------+--------------------------------------+
|       cow       |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+
|      sheep      |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostril              |
+-----------------+--------------------------------------+
|       goat      |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+
|        dog      |                  ears                |
|                 |                 nipples              |
|                 |                  legs                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+

1 Ответ

1 голос
/ 09 марта 2020

Вы не можете delete вложенное поле. Что вы можете сделать, это update все записи, которые имеют rumen с новым значением массива, исключая rumen. Я не совсем уверен в вашей схеме, но это должно быть что-то вроде этого

update tmp.collection c
-- assign new array value, for which we select everything but 'rumen'.
set parts = array(select * from c.parts where part_name <> 'rumen')
-- we only care about the rows that have 'rumen' in the first place.
where exists (select 1 from c.parts where part_name = 'rumen');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...