Улей SQL для определения подмножества - PullRequest
0 голосов
/ 19 мая 2018

У моей компании есть программное обеспечение для создания SQL в Hive SQL.Часть left является гибкой и может быть любого типа (например, String), поскольку у меня есть свобода хранить или конвертировать.Часть right не является гибкой, так как это может быть только в выражении SQL: ('a','b','c').Таким образом, я могу добавить к ней такую ​​функцию, как concat_ws('a','b','c'), но не могу удалить круглую скобку (..) вокруг нее.

Я хочу сделать 2 сценария:

  1. ('a','b') является подмножеством ('a','b','c').Так что это вернет TRUE.Однако ('a','d') - это подмножество ('a','b','c'), которое вернет FALSE, так как d не существует в правой части.
  2. ('a','b') имеет по крайней мереодин элемент в ('a','b','c').Это возвращает TRUE, так как либо a, либо b находится справа.Но ('d','e') имеет по крайней мере один элемент в ('a','b','c') будет FALSE.

Есть ли способ сделать это без написания UDF или добавления сторонних UDF?

Я думал о том, чтобы преобразовать их в нижний регистр и сравнить как трюк, такой как 'ab' это подстрока 'abc' (некрасивое решение):

select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|B')>0;

return TRUE

select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|E')>0;

return FALSE

Но второй случай сложнее.Я предполагаю, что:

  1. Я могу объединить две строки
  2. Разбить на массив с помощью |
  3. Объединить уникальные значения в массив
  4. Количествоконечные элементы массива, если их объединено меньше двух

Странно, но просто идея!

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете посмотреть встроенные функции генерации таблиц ( UDTF ).Например, explode создаст одну строку на элемент вашего массива explode(array ('a', 'b')).Оттуда вы можете использовать обычный SQL-фу.

Полный пример, на самом деле работает в обоих случаях:

 with abc as (
   select explode(array('a', 'b', 'c')) as l
 )
 select
     count(*) = size(array('a', 'b')) as case1
   , count(*) > 0 as case2
 from
   abc 
 where l in
   ('a', 'b') -- true, true
   -- ('a', 'd') -- true, false
   -- ('d', 'e') -- false, false
 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...