Запрос подмножества массива в Snowflake, включая некоторые значения, но исключая другие значения

#sql #snowflake-cloud-data-platform

Вопрос:

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

Пример:

 SELECT column1
FROM table
WHERE array_contains('cats'::variant, column1)
LIMIT 6;
 

с выходом:

 Row column1
1 ["cats","dogs"]
2 ["horses","cows","cats"]
3 ["cats"]
4 ["cats","fish",turtles"]
5 ["cats","turtles","dogs"]
6 ["fish","cats"]
 

НО как бы я написал запрос, который выбирает строки с «кошками» в массиве, но также исключает строки с «коровами» и «рыбами», даже если «кошки» также находятся в этих массивах? Цель состояла бы только в том, чтобы вернуть строки 1, 3 и 5 из приведенных выше выходных данных и исключить другие строки/массивы, в которых есть «коровы» и/или «рыбы», даже если «кошки» также находятся в массиве.

Желаемый вывод подмножества сверху должен быть:

 Row column1
1 ["cats","dogs"]
2 ["cats"]
3 ["cats","turtles","dogs"]
 

Ответ №1:

Просто используйте NOT , ARRAY_CONTAINS и AND :

 with t as (
    select array_construct('dogs', 'cats') column1
    union all select array_construct('dogs', 'cats', 'fish')
)

SELECT column1
FROM t
WHERE array_contains('cats'::variant, column1)
AND NOT array_contains('cows'::variant, column1);
AND NOT array_contains('fish'::variant, column1);
 

Комментарии:

1. … Не arrays_overlap() было бы проще?