Разделение и поиск через запятую в Presto (AWS Athena) - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующая таблица my_table, где оба столбца являются строками -

+------------+-------------+
|     user_id|        code |
+------------+-------------+
|      ABC123|  yyy,123,333|
|        John|  xxx,USA,555|
|      qwerty|  55A,AUS,666|
|      Thomas|  zzz,666,678|
+------------+-------------+

Мне нужно получить все user_id, которые имеют либо yyy, либо 666 в своихcode значение столбца. Я проверил следующий запрос на онлайн-симуляции MySQL, где он работает нормально , но он не будет работать в AWS Athena-

SELECT user_id FROM my_table WHERE CONCAT(",", code, ",") REGEXP ",(yyy|666),";

Результат должен быть-

+------------+
|     user_id|
+------------+
|      ABC123|
|      qwerty|
|      Thomas|
+------------+

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Использование regexp_like:

WHERE regexp_like(code, '(^|,)(xxx|yyy)(,|$)')
presto:default> SELECT regexp_like('yyy,123,333', '(^|,)(xxx|yyy)(,|$)');
 _col0
-------
 true
(1 row)

(протестировано в Presto 322, будет работать и в Афине)

Для «более очевидно правильного»подход, я бы рекомендовал использовать split + contains, хотя это может быть менее производительным.

0 голосов
/ 21 октября 2019

Вы можете использовать функцию regexp_like () , чтобы получить столбцы, проверяющие указанное выше условие. Это вернет логическое значение для соответствующего столбца. Затем вы можете использовать предложение WHERE для фильтрации результата.

ЗАКЛЮЧИТЕЛЬНЫЙ ЗАПРОС:

WITH dataset AS (
     SELECT 
       user_id,
       regexp_like(code, '(^|,)(666|yyy)(,|$)') AS code 
       FROM my_table
)
SELECT user_id from dataset where code=true
0 голосов
/ 18 октября 2019

MySQL имеет встроенную функцию:

select t.*
from t
where find_in_set('666', code) > 0 or find_in_set('yyy', code) > 0;

Хотя эта функция доступна, настоятельно рекомендуется исправить модель данных и НЕ хранить списки в строках. Это не SQLish способ хранить вещи.

...