These are the docs for the Metabase master branch. Some features documented here may not yet be available in the latest release. Check out the docs for the latest version, Metabase v0.55.

Optional variables

You can make a clause optional in a query. For example, you can create an optional WHERE clause that contains a SQL variable, so that if no value is supplied to the variable (either in the filter or via the URL), the query will still run as if there were no WHERE clause.

To make a variable optional in your native query, put [[ .. ]] brackets around the entire clause containing the {{variable}}. If someone inputs a value in the filter widget for the variable, Metabase will place the clause in the template; otherwise Metabase will ignore the clause and run the query as though the clause didn’t exist.

In this example, if no value is given to cat, then the query will just select all the rows from the products table. But if cat does have a value, like “Widget”, then the query will only grab the products with a category type of Widget:


SELECT
  count(*)
FROM
  products
[[WHERE category = {{cat}}]]

Your SQL must also be able to run without the optional clause in [[ ]]

You need to make sure that your SQL is still valid when no value is passed to the variable in the bracketed clause.

For example, excluding the WHERE keyword from the bracketed clause will cause an error if there’s no value given for cat:

-- this will cause an error:

SELECT
  count(*)
FROM
  products
WHERE
  [[category = {{cat}}]]

That’s because when no value is given for cat, Metabase will try to execute SQL as if the clause in [[ ]] didn’t exist:

SELECT
  count(*)
FROM
  products
WHERE

Which is not a valid SQL query. Instead, put the entire WHERE clause in [[ ]]:


SELECT
  count(*)
FROM
  products
[[WHERE
  category = {{cat}}]]

When there’s no value given for cat, Metabase will still execute a valid query:


SELECT
  count(*)
FROM
  products

You need at least one WHERE when using multiple optional clauses

To use multiple optional clauses, you must include at least one regular WHERE clause followed by optional clauses, each starting with AND:


SELECT
  count(*)
FROM
  products
WHERE
  TRUE
  [[AND id = {{id}}]]
  [[AND {{category}}]]

That last clause uses a field filter (note the lack of a column in the AND clause). When using a field filter, you must exclude the column in the query; you need to map the variable in the side panel.

Optional variables in MongoDB

If you’re using MongoDB, you can make a clause optional like so:


[
    [[{
        $match: {category: {{cat}}}
    },]]
    {
        $count: "Total"
    }
]

Or with multiple optional filters:


[
    [[{ $match: {{cat}} },]]
    [[{ $match: { price: { "$gt": {{minprice}} } } },]]
    {
        $count: "Total"
    }
]

Setting complex default values in the query

You can also define default values directly in your query by enclosing comment syntax inside the end brackets of an optional parameter.

WHERE column = [[ {{ your_parameter }} --]] your_default_value

The comment will “activate” whenever you pass a value to your_parameter.

This is useful when defining complex default values (for example, if your default value is a function like CURRENT_DATE). Here’s a PostgreSQL example that sets the default value of a Date filter to the current date using CURRENT_DATE:


SELECT
  *
FROM
  orders
WHERE
  DATE(created_at) = [[ {{dateOfCreation}} --]] CURRENT_DATE

If you pass a value to the variable, the WHERE clause runs, including the comment syntax that comments out the default CURRENT_DATE function.

Note that the hash (--) used to comment the text might need to be replaced by the comment syntax specific to the database you’re using.

Read docs for other versions of Metabase.

Was this helpful?

Thanks for your feedback!
Want to improve these docs? Propose a change.