Динамический SQL для создания серии операторов «LIKE» в Snowflake

#snowflake-cloud-data-platform #dynamic-sql

Вопрос:

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

Я хотел бы использовать таблицу с частями имен в качестве списка исключений, чтобы мне не нужно было поддерживать оператор like. Например, если у меня есть следующие 2 таблицы:

 CREATE or REPLACE TABLE test ( id number, last_name varchar, first_name varchar ) as SELECT * FROM VALUES  (1, 'Goehan', 'Aylin'), (2, 'Jacobs', 'Alvin'), (3, 'Kong', 'Jackie'), (4, 'Yong', 'Steve'), (5, 'Joe', 'Black');   CREATE or REPLACE TABLE test_excludes ( excl_last varchar ) as SELECT * FROM VALUES  ('ong'), ('oe');  

Что я пытаюсь сделать, так это исключить «Йонг», «Конг», «Гоехан» и «Джо». Однако я думаю, что если я сделаю какое-то декартово объединение, это может быть неэффективно, поэтому мне интересно, можно ли использовать динамический SQL для создания оператора ilike с помощью Snowflake.

Ответ №1:

ЛЕВОГО СОЕДИНЕНИЯ будет достаточно:

 SELECT t.* FROM test t LEFT JOIN test_excludes e  ON t.last_name ILIKE '%' || e.excl_last -- || '%' -- if anywhere in the string WHERE e.excl_last IS NULL;  

Выход:

введите описание изображения здесь