title |
---|
Coalesce |
coalesce
looks at the values in a list (in order), and returns the first non-null value.
This function is useful when you want to:
- fill in missing data,
- consolidate data from multiple columns, or
- create calculations across multiple columns.
Syntax | Example |
---|---|
coalesce(value1, value2, …) |
coalesce("null", "null", "bananas", "null" …) |
Returns the first non-null value from a list of values. | “bananas” |
left_table_col | right_table_col | coalesce([right_table_col], 0) |
---|---|---|
1 | 1 | 1 |
2 | null |
0 |
3 | null |
0 |
4 | 4 | 4 |
You may want to fill in empty or null values if you have:
- Sparse data.
null
values created by a left join (the example shown above).
For a more detailed example, see Filling in data for missing report 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 |
Calculations in Metabase will return null
if any of the input columns are null
. This is because null
values in your data represent "missing" or "unknown" information, which isn't necessarily the same as an amount of "0". That is, adding 1 + "unknown" = "unknown".
If you want to treat "unknown" values as zeroes (or some other value that means "nothing" in your data), we recommend using coalesce
to wrap the columns used in your calculations.
Data type | Works with coalesce |
---|---|
String | ✅ |
Number | ✅ |
Timestamp | ✅ |
Boolean | ✅ |
JSON | ❌ |
Use the same data types within a single coalesce
function. If you want to coalesce values that have different data types:
- Use the SQL
CAST
operator. - Change the data type from the Table Metadata page.
If you want to use coalesce
with JSON or JSONB data types, you'll need to flatten the JSON objects first. For more information, look up the JSON functions that are available in your SQL dialect. You can find some common SQL reference guides here.
This section covers functions and formulas that can be used interchangeably with the Metabase coalesce
expression, with notes on how to choose the best option for your use case.
Metabase expressions
Other tools
All examples use the custom expression and sample data from the Consolidating values example:
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. |
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")
is equivalent to the Metabase coalesce
expression:
coalesce([Notes], [Comments] "No notes or comments.")
coalesce
is much nicer to write if you don't mind taking the first value when both of your columns are non-blank. Use case
if you want to define a specific output (e.g., if you want to return "I have a note and a comment" instead of "I have a note".).
In most cases (unless you're using a NoSQL database), questions created from the notebook editor are converted into SQL queries that run against your database or data warehouse.
The SQL coalesce
function
SELECT
COALESCE(notes, comments, "no notes or comments")
FROM
sample_table;
is equivalent to the Metabase coalesce
expression:
coalesce([Notes], [Comments] "No notes or comments.")
If your notes and comments table is in a spreadsheet where "Notes" is in column A, and "Comments" is in column B, then the formula
=IF(ISBLANK($A2),$B2,IF(ISBLANK($B2),$A2,"No notes or comments."))
is equivalent to the Metabase coalesce
expression:
coalesce([Notes], [Comments] "No notes or comments.")
Alternatively, you may be used to working with a INDEX and MATCH in an array formula if you’re “coalescing” data across three or more columns in a spreadsheet.
Assuming the notes and comments table is in a dataframe called df
, the combination of pandas
functions combine_first()
and fillna()
df['custom_column'] = df['notes'].combine_first(df['comments'])\
.fillna('No notes or comments.')
are equivalent to the Metabase coalesce
expression:
coalesce([Notes], [Comments] "No notes or comments.")