Выберите строки из таблицы, в которой столбец, содержащий разделенные строки разделителя, соответствует по крайней мере одной строке из другого набора строк в кусте - PullRequest
0 голосов
/ 19 мая 2019

enter image description here

В таблице «App» столбец содержит длинную строку (ex - «aa; bb; cc») . У меня есть другой набор строк, которые имеют несколько строк ('aa', 'bb', 'cc') . Я хочу выбрать строки, которые по крайней мере содержат одну строк из ('aa', 'bb', 'cc') .

1 Ответ

0 голосов
/ 20 мая 2019

Если ваша тестовая строка имеет ограниченное количество элементов, вы можете разделить ее и проверить, что каждый элемент существует в приложении, используя array_contains ().

Демо:

 with your_data as 
 ( --Test dataset, replace it with your table
  select stack(5, --5 tuples
                  'aa\\;bb\\;cc',
                  'dd\\;cc\\;ff',
                  'ww\\;xx\\;yy',
                  'ww\\;aa\\;yy',
                  'pp\\;bb\\;qq'                                
               ) as App
 ),

 test_string as 
 ( --This can be also a dataset, or replace it with string parameter
   --according to your requirements
 select "'aa','bb','cc'" as str2 --contains values in single quotes delimited by comma
 )

 select App from
 (
 select App, split(App, '\\;') AppArray, 
        split(regexp_replace(t.str2,"'",''),',') as TestArray2 --remove single quotes and split
   from your_data 
        cross join test_string t 
        --cross join here. This is one string example only. Rewrite join according to your dataset.
 )s
 where array_contains(AppArray, TestArray2[0]) or --First element exists
       array_contains(AppArray, TestArray2[1]) or --second
       array_contains(AppArray, TestArray2[2])    --third
 ;

Результат:

OK
aa;bb;cc
dd;cc;ff
ww;aa;yy
pp;bb;qq
Time taken: 41.853 seconds, Fetched: 4 row(s)
...