#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()
было бы проще?