SQL Resources
SQL
COALESCE

COALESCE

Definition

The COALESCE function in BigQuery will return the first non-NULL expression. It's often used to safely handle NULL values.

Syntax

COALESCE(expr[, ...])

Returns: Supertype of expr

SELECT
  COALESCE(NULL, 'A', 'B') AS coalesced
coalesced
A

Practical Info

  • Often used similarly to IFNULL
  • Common Questions

    How do I include NULL values in my aggregations?

    In this case if you want to include NULL values in your aggregations, like AVG, you can use COALESCE to convert any nulls to a number. In this column, we convert all NULL values to 1 before taking the SUM so the NULL row is included in customers but not in normal_sum.

    SELECT
      AVG(COALESCE(is_customer, 0)) AS customers,
      AVG(is_customer) AS normal_sum
    FROM
      (
        SELECT
          1 AS is_customer
        UNION ALL
    (    SELECT
          NULL AS is_customer)
        UNION ALL
    (    SELECT
          0 AS is_customer)
      ) AS table_3
    customersnormal_sum
    0.333333333333333370.5

    In this case the result of the AVG of the same column is different whether the NULL row is included as a 0 or not included at all.

    How to JOIN 2 tables with COALESCE?

    Let's say you want to join 2 tables, and if you can you want to join on user_id, but if the user_id is null you want to join on the name. You can use COALESCE to help with that!

    with table1 as (
      SELECT
      1 AS user_id,
      'Dave' AS name
    UNION ALL
    (SELECT
      NULL AS user_id,
      'Nancy' AS name)
    UNION ALL
    (SELECT
      2 AS user_id,
      'Bob' AS name)
    ),
    table2 as (SELECT
      1 AS user_id,
      'Dave' AS name,
      87 AS score
    UNION ALL
    (SELECT
      NULL AS user_id,
      'Nancy' AS name,
      92 AS score))
    SELECT
      *
    FROM
      table1
      FULL OUTER JOIN table2 ON (COALESCE(CAST(table1.user_id AS STRING), table1.name) = COALESCE(CAST(table2.user_id AS STRING), table2.name))
    user_idname
    1Dave
    nullNancy
    2Bob
    SELECT
      1 AS user_id,
      'Dave' AS name,
      87 AS score
    UNION ALL
      (SELECT
       NULL AS user_id,
       'Nancy' AS name,
       92 AS score)
    user_idnamescore
    1Dave87
    nullNancy92
    SELECT
      *
    FROM
      table1
    FULL OUTER JOIN table2 ON (COALESCE(CAST(table1.user_id AS STRING), table1.name) = COALESCE(CAST(table2.user_id AS STRING), table2.name))
    user_idnameuser_id_1name_1score
    1Dave1Dave87
    nullNancynullNancy92
    2Bobnullnullnull
    Note - the join columns have to be the same type. In this case we casted our user_id to a string to make it compatible with the name column.

    Troubleshooting Common Errors

    No matching signature for function COALESCE for argument types. Supported signature: COALESCE([ANY, ...])

    This error happens when BigQuery encounters different data types. Since it needs to create a column of a single type, it will error if it sometimes evaluates to a STRING and sometimes an INT64.

    To resolve this use CAST to ensure your COALESCE parameters are all of the correct type.

    Related Pages

  • CAST
  • IF
  • CASE
  • Data Types in Standard SQL
  • Subscribe to newsletter

    Subscribe to receive the latest blog posts to your inbox every week.

    By subscribing you agree to our Privacy Policy.
    Thank you! Your submission has been received!
    Oops! Something went wrong while submitting the form.

    Start solving your organization's biggest problems with Count today.

    Stay up to date with all things count, data and problem solving.