# Coalesce `coalesce` просматривает значения в списке (по порядку) и возвращает первое ненулевое значение. Эта функция полезна, когда вы хотите: - [заполнить недостающие данные](#filling-in-empty-or-null-values), - [объединить данные из нескольких столбцов](#consolidating-values-from-different-columns), or - [создавать расчеты по нескольким столбцам](#creating-calculations-across-different-columns). | Синтаксис | Пример | | ------------------------------------------------------- | ----------------------------------------------- | | `coalesce(value1, value2, …)` | `coalesce("null", "null", "bananas", "null" …)` | | Возвращает первое ненулевое значение из списка значений | “bananas” | ## Заполнение пустых или нулевых значений | left_table_col | right_table_col | `coalesce([right_table_col], 0)` | | -------------- | --------------- | -------------------------------- | | 1 | 1 | 1 | | 2 | `null` | 0 | | 3 | `null` | 0 | | 4 | 4 | 4 | Вы можете заполнить пустые или нулевые значения, если у вас есть: - Разреженные данные. - `null` значения, созданные левым соединением (пример, показанный выше). Более подробный пример см. в [Заполнение данных для отсутствующих дат отчета][missing-dates]. ## Объединение значений из разных столбцов | Notes | Comments | `coalesce([Notes], [Comments] "No notes or comments.")` | | -------------- | ----------------- | ------------------------------------------------------- | | I have a note. | I have a comment. | I have a note. | | | I have a comment. | I have a comment. | | I have a note. | | I have a note. | | | | No notes or comments. | ## Создание расчетов по разным столбцам | Subtotal | Discount | `coalesce([Subtotal], 0) - coalesce([Discount], 0)` | | -------- | -------- | --------------------------------------------------- | | 10.00 | 0.15 | 9.85 | | 21.00 | | 21.00 | | 16.00 | 1.60 | 14.40 | | 4.00 | | 4.00 | Вычисления в GlarusBI вернут `null`, если какой-либо из входных столбцов `null`. Это связано с тем, что нулевые значения в ваших данных представляют «отсутствующую» или «неизвестную» информацию, которая не обязательно совпадает с количеством «0». То есть сложение 1 + «неизвестно» = «неизвестно». Если вы хотите рассматривать «неизвестные» значения как нули (или какое-либо другое значение, которое означает «ничего» в ваших данных), мы рекомендуем использовать `объединить` для переноса столбцов, используемых в ваших вычислениях. ## Допустимые типы данных | [Тип данных][data-types] | работают с `coalesce` | | ----------------------- | --------------------- | | Строка | ✅ | | Число | ✅ | | Дата | ✅ | | Условие | ✅ | | JSON | ❌ | ## Ограничения Используйте одни и те же типы данных в одной функции `coalesce`. Если вы хотите объединить значения, которые имеют разные типы данных: - Используйте оператор SQL `CAST`. - [Изменить тип данных на странице метаданных таблицы][cast-data-type]. Если вы хотите использовать `coalesce` с типами данных JSON или JSONB, вам нужно сначала сгладить объекты JSON. Для получения дополнительной информации найдите функции JSON, доступные на вашем диалекте SQL. Вы можете найти некоторые [общие справочные руководства по SQL здесь][sql-reference-guide]. ## Связанные функции В этом разделе рассматриваются функции и формулы, которые можно использовать взаимозаменяемо с выражением GlarusBI `coalesce`, с примечаниями о том, как выбрать лучший вариант для вашего случая использования. **Выражения GlarusBI** - [кейс](#case) **Другие инструменты** - [SQL](#sql) - [Таблицы](#spreadsheets) - [Python](#python) Все примеры используют пользовательское выражение и примеры данных из [Консолидация значений](#consolidating-values-from-different-columns) Пример: | Notes | Comments | `coalesce([Notes], [Comments] "No notes or comments.")` | | -------------- | ----------------- | ------------------------------------------------------- | | I have a note. | I have a comment. | I have a note. | | | I have a comment. | I have a comment. | | I have a note. | | I have a note. | | | | No notes or comments. | ### Кейс [Выражение GlarusBI `case`](./case.md) ``` case(ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = FALSE, [Notes], ISBLANK([Notes]) = TRUE AND ISBLANK([Comments]) = False, [Comments], ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = TRUE, [Notes], ISBLANK([Notes]) = TRUE AND ISBLANK([Comments]) = TRUE, "No notes or comments") ``` идентично выражению `coalesce`: ``` coalesce([Notes], [Comments] "No notes or comments.") ``` `coalesce` гораздо приятнее писать, если вы не против взять первое значение, когда оба ваших столбца не пусты. [Используйте `case`, если вы хотите определить конкретный вывод][case-to-coalesce] (например, если вы хотите вернуть «У меня есть примечание _и_ комментарий» вместо «У меня есть примечание».). ### SQL В большинстве случаев (если вы не используете базу данных NoSQL) вопросы, созданные в [редакторе блокнота][notebook-editor-def], преобразуются в SQL-запросы, которые выполняются в вашей базе данных или хранилище данных. Функция SQL `coalesce` ```sql SELECT COALESCE(notes, comments, "no notes or comments") FROM sample_table; ``` идентично выражению `coalesce` GlarusBI: ``` coalesce([Notes], [Comments] "No notes or comments.") ``` ### Таблицы Если ваша [таблица примечаний и комментариев](#consolidating-values-from-other-columns) находится в электронной таблице, где «Примечания» находятся в столбце A, а «Комментарии» — в столбце B, тогда формула ``` =IF(ISBLANK($A2),$B2,IF(ISBLANK($B2),$A2,"No notes or comments.")) ``` идентично выражению `coalesce` GlarusBI: ``` coalesce([Notes], [Comments] "No notes or comments.") ``` В качестве альтернативы вы можете привыкнуть к работе с INDEX и MATCH в формуле массива, если вы «объединяете» данные по трем или более столбцам электронной таблицы. ### Python Предполагая, что [таблица примечаний и комментариев] (#consolidating-values-from-other-columns) находится в фрейме данных с именем `df`, комбинация функций `pandas` `combine_first()` и `fillna()` ``` df['custom_column'] = df['notes'].combine_first(df['comments'])\ .fillna('No notes or comments.') ``` идентично выражению `coalesce` GlarusBI: ``` coalesce([Notes], [Comments] "No notes or comments.") ``` ## Дополнительная информация - [Документация по кастомным выражениям](../expressions.md) - [Руководство по кастомным выражениям. Документация Metabase](https://www.metabase.com/learn/questions/custom-expressions) [case-to-coalesce]: ./case.md#coalesce [cast-data-type]: ../../../data-modeling/metadata-editing.md#casting-to-a-specific-data-type [custom-expressions-doc]: ../expressions.md [custom-expressions-learn]: https://www.metabase.com/learn/questions/custom-expressions [data-types]: https://www.metabase.com/learn/databases/data-types-overview#examples-of-data-types [missing-dates]: https://www.metabase.com/learn/debugging-sql/sql-logic-missing-data#how-to-fill-in-data-for-missing-report-dates [notebook-editor-def]: https://www.metabase.com/glossary/notebook_editor [numpy]: https://numpy.org/doc/ [pandas]: https://pandas.pydata.org/pandas-docs/stable/ [spreadsheets-to-bi]: /blog/spreadsheets-to-bi [sql-reference-guide]: https://www.metabase.com/learn/debugging-sql/sql-syntax.html#common-sql-reference-guides