GoogleSQL for BigQuery supports conditional expressions. Conditional expressions impose constraints on the evaluation order of their inputs. In essence, they are evaluated left to right, with short-circuiting, and only evaluate the output value that was chosen. In contrast, all inputs to regular functions are evaluated before calling the function. Short-circuiting in conditional expressions can be exploited for error handling or performance tuning.
Expression list
Name | Summary |
---|---|
CASE expr | Compares the given expression to each successive WHEN clause and produces the first result where the values are equal. |
CASE | Evaluates the condition of each successive WHEN clause and produces the first result where the condition evaluates to TRUE . |
COALESCE | Produces the value of the first non-NULL expression, if any, otherwise NULL . |
IF | If an expression evaluates to TRUE , produces a specified result, otherwise produces the evaluation for an else result. |
IFNULL | If an expression evaluates to NULL , produces a specified result, otherwise produces the expression. |
NULLIF | Produces NULL if the first expression that matches another evaluates to TRUE , otherwise returns the first expression. |
CASE expr
CASE expr WHEN expr_to_match THEN result [ ... ] [ ELSE else_result ] END
Description
Compares expr
to expr_to_match
of each successive WHEN
clause and returns the first result where this comparison evaluates to TRUE
. The remaining WHEN
clauses and else_result
aren't evaluated.
If the expr = expr_to_match
comparison evaluates to FALSE
or NULL
for all WHEN
clauses, returns the evaluation of else_result
if present; if else_result
isn't present, then returns NULL
.
Consistent with equality comparisons elsewhere, if both expr
and expr_to_match
are NULL
, then expr = expr_to_match
evaluates to NULL
, which returns else_result
. If a CASE statement needs to distinguish a NULL
value, then the alternate CASE syntax should be used.
expr
and expr_to_match
can be any type. They must be implicitly coercible to a common supertype; equality comparisons are done on coerced values. There may be multiple result
types. result
and else_result
expressions must be coercible to a common supertype.
This expression supports specifying collation.
Return Data Type
Supertype of result
[, ...] and else_result
.
Example
WITH Numbers AS ( SELECT 90 as A, 2 as B UNION ALL SELECT 50, 8 UNION ALL SELECT 60, 6 UNION ALL SELECT 50, 10 ) SELECT A, B, CASE A WHEN 90 THEN 'red' WHEN 50 THEN 'blue' ELSE 'green' END AS result FROM Numbers /*------------------* | A | B | result | +------------------+ | 90 | 2 | red | | 50 | 8 | blue | | 60 | 6 | green | | 50 | 10 | blue | *------------------*/
CASE
CASE WHEN condition THEN result [ ... ] [ ELSE else_result ] END
Description
Evaluates the condition of each successive WHEN
clause and returns the first result where the condition evaluates to TRUE
; any remaining WHEN
clauses and else_result
aren't evaluated.
If all conditions evaluate to FALSE
or NULL
, returns evaluation of else_result
if present; if else_result
isn't present, then returns NULL
.
For additional rules on how values are evaluated, see the three-valued logic table in Logical operators.
condition
must be a boolean expression. There may be multiple result
types. result
and else_result
expressions must be implicitly coercible to a common supertype.
This expression supports specifying collation.
Return Data Type
Supertype of result
[, ...] and else_result
.
Example
WITH Numbers AS ( SELECT 90 as A, 2 as B UNION ALL SELECT 50, 6 UNION ALL SELECT 20, 10 ) SELECT A, B, CASE WHEN A > 60 THEN 'red' WHEN B = 6 THEN 'blue' ELSE 'green' END AS result FROM Numbers /*------------------* | A | B | result | +------------------+ | 90 | 2 | red | | 50 | 6 | blue | | 20 | 10 | green | *------------------*/
COALESCE
COALESCE(expr[, ...])
Description
Returns the value of the first non-NULL
expression, if any, otherwise NULL
. The remaining expressions aren't evaluated. An input expression can be any type. There may be multiple input expression types. All input expressions must be implicitly coercible to a common supertype.
Return Data Type
Supertype of expr
[, ...].
Examples
SELECT COALESCE('A', 'B', 'C') as result /*--------* | result | +--------+ | A | *--------*/
SELECT COALESCE(NULL, 'B', 'C') as result /*--------* | result | +--------+ | B | *--------*/
IF
IF(expr, true_result, else_result)
Description
If expr
evaluates to TRUE
, returns true_result
, else returns the evaluation for else_result
. else_result
isn't evaluated if expr
evaluates to TRUE
. true_result
isn't evaluated if expr
evaluates to FALSE
or NULL
.
expr
must be a boolean expression. true_result
and else_result
must be coercible to a common supertype.
Return Data Type
Supertype of true_result
and else_result
.
Examples
SELECT 10 AS A, 20 AS B, IF(10 < 20, 'true', 'false') AS result /*------------------* | A | B | result | +------------------+ | 10 | 20 | true | *------------------*/
SELECT 30 AS A, 20 AS B, IF(30 < 20, 'true', 'false') AS result /*------------------* | A | B | result | +------------------+ | 30 | 20 | false | *------------------*/
IFNULL
IFNULL(expr, null_result)
Description
If expr
evaluates to NULL
, returns null_result
. Otherwise, returns expr
. If expr
doesn't evaluate to NULL
, null_result
isn't evaluated.
expr
and null_result
can be any type and must be implicitly coercible to a common supertype. Synonym for COALESCE(expr, null_result)
.
Return Data Type
Supertype of expr
or null_result
.
Examples
SELECT IFNULL(NULL, 0) as result /*--------* | result | +--------+ | 0 | *--------*/
SELECT IFNULL(10, 0) as result /*--------* | result | +--------+ | 10 | *--------*/
NULLIF
NULLIF(expr, expr_to_match)
Description
Returns NULL
if expr = expr_to_match
evaluates to TRUE
, otherwise returns expr
.
expr
and expr_to_match
must be implicitly coercible to a common supertype, and must be comparable.
This expression supports specifying collation.
Return Data Type
Supertype of expr
and expr_to_match
.
Example
SELECT NULLIF(0, 0) as result /*--------* | result | +--------+ | NULL | *--------*/
SELECT NULLIF(10, 0) as result /*--------* | result | +--------+ | 10 | *--------*/