Преобразование запроса MongoDB в Snowflake

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

Функция Mongo DB: $ all
Оператор $ all выбирает документы, в которых значением поля является массив, содержащий все указанные элементы.

Запрос Mongo:

db.collection('collection_name').find({
  'code': { '$in': [ 'C0001' ] },
  'months': { '$all': [ 6, 7, 8, 9 ] } --> 6,7,8,9 given parameters
});


Table Structure in snowflake:
column name       datatype
code               varchar(50)
id                 int
months             ARRAY
weeks              ARRAY

Не могли бы вы подсказать, как написать этот запрос в Snowflake? Любые рекомендации были бы полезны.


person gvr76    schedule 07.11.2020    source источник


Ответы (1)


Вы можете использовать ARRAY_SIZE и ARRAY_INTERSECTION, чтобы проверить это:

Вот примерная таблица:

create or replace table test ( code varchar, months array );

insert into test select 'C0002', array_construct( 1, 2, 5,8,6,3)
union all select 'C0001', array_construct( 1,2,3 ) 
union all select 'C0002', array_construct( 2, 12, 3,7,9) 
union all select 'C0001', array_construct( 7,8,9,3, 2) ;

Вот запрос для проверки:

select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION(  months, array_construct( 3, 2 ))) = 2;

Итак, я нахожу пересечение двух массивов и проверяю количество элементов. Если вы хотите найти 3 элемента, вы должны установить 3 (и это выглядит так):

select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION(  months, array_construct( 3, 2, 7 ))) = 3;
person Gokhan Atil    schedule 07.11.2020