Postgresql массив массивов равен? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько таблиц: вещи сделаны из частей.Детали могут быть разных цветов.Каждая вещь имеет цвет по умолчанию.И если детали не присвоен цвет, то она наследуется от вещи.

`colors`
id | color 
 1 | red
 2 | green
 3 | blue

`parts`
id | color_id
 1 | 1
 2 | 
 3 | 2

`things`
id | default_color | name
 1 |       1       | first 
 2 |       2       | second
 3 |       2       | third

`parts_has_things`
id | part_id | thing_id
 1 |    1    |    1
 2 |    2    |    1
 3 |    3    |    1
 4 |    1    |    2
 5 |    2    |    2
 6 |    3    |    2
 7 |    1    |    3

И теперь, зная, какую именно вещь я хочу (детали и их цвета), я пытаюсь найтиэто в базе данных.

SELECT
  things.id,
  ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color)
FROM things
JOIN parts_has_things ON parts_has_things.thing_id = things.id
JOIN parts ON parts.id = parts_has_things.part_id
HAVING
ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color) @> ARRAY[ARRAY[1,1],ARRAY[2,1],ARRAY[3,2]]::BIGINT[][] AND
ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color) <@ ARRAY[ARRAY[1,1],ARRAY[2,1],ARRAY[3,2]]::BIGINT[][]

результат:

1 | {{1,1}, {2,1}, {3,2}} //i want get only this item
2 | {{1,1}, {2,2}, {3,2}}  

Как я могу сравнить массив массивов здесь?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Одно из найденных мной решений - преобразование в jsonb

SELECT
  things.id,
  ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color))
FROM things
JOIN parts_has_things ON parts_has_things.thing_id = things.id
JOIN parts ON parts.id = parts_has_things.part_id
HAVING
array_to_json(ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color)))::jsonb @> array_to_json(ARRAY[ARRAY[1,1],ARRAY[2,1],ARRAY[3,2]])::jsonb AND
array_to_json(ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color)))::jsonb <@ array_to_json(ARRAY[ARRAY[1,1],ARRAY[2,1],ARRAY[3,2]])::jsonb

UPD: не работает:)

0 голосов
/ 18 сентября 2018

Закажите ваши массивы в ARRAY_AGG, затем вы можете использовать =, чтобы сравнить их с литералом упорядоченного массива:

SELECT
  things.id,
  ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color)
FROM things
JOIN parts_has_things ON parts_has_things.thing_id = things.id
JOIN parts ON parts.id = parts_has_things.part_id
HAVING
ARRAY_AGG(DISTINCT ARRAY[parts.id, coalesce(parts.color_id, things.default_color)] ORDER BY parts.color_id) = ARRAY[ARRAY[1,1],ARRAY[2,1],ARRAY[3,2]]::BIGINT[][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...