# #sql #hash #google-bigquery
Вопрос:
Я хочу создать хэш-столбец в своей таблице. Я хочу поместить все значения строки в этот столбец, как объединение, и заменить null любым символом. И каждая ячейка должна быть разделена разделителем.
например
A B C D HashColumn 1 2 Null 4 1/2/_/4 12 Null 4 5 12/_/4/5
Я хочу сделать это для нескольких таблиц, поэтому для этого нужен динамический запрос.
Пожалуйста, скажите мне, как я могу это сделать в bigquery
Ответ №1:
Я бы рекомендовал следующий простой подход
select *, format('%t', t) HashColumn from your_table t
если применить к образцам данных в вашем вопросе — вывод будет
Что выглядит достаточно хорошо в качестве хэша для меня. Но в случае, если вам действительно нужен формат, который вы упомянули в вопросе, вы можете выполнить дополнительную обработку строк, например
select *, replace(trim(format('%t', t), '()'), 'NULL', '_') HashColumn from your_table t
в этом случае — вывод будет
Комментарии:
1. Рад, что это работает на вас. Пожалуйста, подумайте также о том, чтобы проголосовать за ответ, если это помогло :o)
2. @MikhailBerlynt Готово 🙂 На самом деле я хочу спросить еще об одной вещи. Теперь я хочу применить функцию ОБРЕЗКИ к своим столбцам в первом запросе, которым вы поделились. Если я выполняю ОБРЕЗКУ(формат («%t», t)), это не работает, и если я выполняю форматирование («%t», ОБРЕЗКА(t)), это приводит к ошибке, так как столбцы имеют разные типы данных и поддерживают только строки и байты. Не могли бы вы, пожалуйста, подсказать мне решение этой проблемы?
3. Такой подход не позволяет обрабатывать отдельные столбцы, а скорее имеет дело со всей строкой — в этом прелесть такого подхода. Если вам действительно нужно применить ОБРЕЗКУ на уровне столбцов — вы можете использовать ответ Сергея или если это все еще не работает для вас — пожалуйста, опубликуйте новый вопрос со всеми соответствующими деталями и образцом данных, и мы постараемся вам помочь. Хорошо? :о)
Ответ №2:
Попробуй вот это:
select IFNULL(CAST(A as string), '_') || '/' || IFNULL(CAST(B as string), '_') || '/' || IFNULL(CAST(C as string), '_') || '/' || IFNULL(CAST(D as string), '_') from mytable