Лучший способ сохранить массив с учетом всех совпадений, как запрос? - PullRequest
0 голосов
/ 28 февраля 2020

Мне нужны советы, чтобы добиться чего-то, над чем я работаю. У меня есть json, и я должен хранить его в снежинке. Все просто, как звучит, за исключением поля массива.

В этом Джейсоне у меня есть массив с неопределенным числом строк, и я не знаю, какой из них лучше всего хранить.

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

Моя первая идея - сохранить его как массив с типом ARRAY, а затем, в запросе, добавить несколько предложений WHERE. для каждого из элементов, которые должны совпадать.

Пример:

Рассматривая элемент с этим массивом:

["one", "two", "trhee"]

... WHERE array_contains ('one', fieldReference) И ... WHERE array_contains ('two', fieldReference) ...

Я думаю, это работает, но я не знаю, если это это лучший способ достичь этого. Я даже не знаю, является ли лучший способ хранения этих значений массивом.

Не могли бы вы дать мне какие-нибудь советы?

Спасибо.

1 Ответ

2 голосов
/ 28 февраля 2020

Сначала я подумал, что вы, возможно, сможете использовать функцию ARRAY_OVERLAP (), но, по-видимому, это даст вам значение ИСТИНА, если есть какие-либо совпадения, но не все элементы совпадают.

https://docs.snowflake.net/manuals/sql-reference/functions/arrays_overlap.html


Я думаю, что вы можете использовать функцию ARRAY_INTERSECTION () и проверить результаты этой функции в вашем поисковом массиве на равенство с массивом (списком) значений, которыми вы являетесь поиск.

https://docs.snowflake.net/manuals/sql-reference/functions/array_intersection.html

Пример выглядит следующим образом:

CREATE OR REPLACE TABLE array_demo (id INTEGER, array1 ARRAY);

INSERT INTO array_demo (id, array1)
    SELECT 1, array_construct(1, 2) UNION ALL
    SELECT 2, array_construct(2, 3) UNION ALL
    SELECT 3, array_construct(3, 4) UNION ALL
    SELECT 4, array_construct(1, 2, 3, 4, 5);

SET search_array = '[2,3]';

SELECT *
FROM   array_demo
WHERE  array_intersection(array1, parse_json($search_array)) = parse_json($search_array);
--returns two records, ids 2 and 4
...