2018-11-20 19:43:05 -05:00
|
|
|
|
[role="xpack"]
|
|
|
|
|
[testenv="basic"]
|
|
|
|
|
[[sql-functions-conditional]]
|
2019-04-22 12:26:15 -04:00
|
|
|
|
=== Conditional Functions And Expressions
|
2018-11-20 19:43:05 -05:00
|
|
|
|
|
|
|
|
|
Functions that return one of their arguments by evaluating in an if-else manner.
|
|
|
|
|
|
2019-04-22 12:26:15 -04:00
|
|
|
|
[[sql-functions-conditional-case]]
|
|
|
|
|
==== `CASE`
|
|
|
|
|
|
|
|
|
|
.Synopsis:
|
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
|
|
|
|
CASE WHEN condition THEN result
|
|
|
|
|
[WHEN ...]
|
|
|
|
|
[ELSE default_result]
|
|
|
|
|
END
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
One or multiple _WHEN *condition* THEN *result_* clauses are used and the expression can optionally have
|
|
|
|
|
an _ELSE *default_result_* clause. Every *condition* should be a boolean expression.
|
|
|
|
|
|
|
|
|
|
*Output*: one of the *result* expressions if the corresponding _WHEN *condition_* evaluates to `true` or
|
|
|
|
|
the *default_result* if all _WHEN *condition_* clauses evaluate to `false`. If the optional _ELSE *default_result_*
|
|
|
|
|
clause is missing and all _WHEN *condition_* clauses evaluate to `false` then `null` is returned.
|
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
|
|
|
|
The CASE expression is a generic conditional expression which simulates if/else statements of other programming languages
|
|
|
|
|
If the condition’s result is true, the value of the result expression that follows the condition will be the returned
|
|
|
|
|
the subsequent when clauses will be skipped and not processed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[case]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseReturnNull]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithElse]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
As a variant, a case expression can be expressed with a syntax similar to *switch-case* of other programming languages:
|
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
|
|
|
|
CASE expression
|
|
|
|
|
WHEN value1 THEN result1
|
|
|
|
|
[WHEN value2 THEN result2]
|
|
|
|
|
[WHEN ...]
|
|
|
|
|
[ELSE default_result]
|
|
|
|
|
END
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
In this case it's transformed internally to:
|
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
|
|
|
|
CASE WHEN expression = value1 THEN result1
|
|
|
|
|
[WHEN expression = value2 THEN result2]
|
|
|
|
|
[WHEN ...]
|
|
|
|
|
[ELSE default_result]
|
|
|
|
|
END
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithOperand]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithOperandAndElse]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
===============================
|
|
|
|
|
All result expressions must be of compatible data types. More specifically all result
|
|
|
|
|
expressions should have a compatible data type with the 1st _non-null_ result expression.
|
|
|
|
|
E.g.:
|
|
|
|
|
|
|
|
|
|
for the following query:
|
|
|
|
|
|
|
|
|
|
[source, sql]
|
|
|
|
|
CASE WHEN a = 1 THEN null
|
|
|
|
|
WHEN a > 2 THEN 10
|
|
|
|
|
WHEN a > 5 THEN 'foo'
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
an error message would be returned, mentioning that *'foo'* is of data type *keyword*,
|
|
|
|
|
which does not match the expected data type *integer* (based on result *10*).
|
|
|
|
|
===============================
|
|
|
|
|
|
2018-11-20 19:43:05 -05:00
|
|
|
|
[[sql-functions-conditional-coalesce]]
|
|
|
|
|
==== `COALESCE`
|
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-20 19:43:05 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
COALESCE(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression, <2>
|
|
|
|
|
...)
|
2018-11-20 19:43:05 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
**N**th expression
|
|
|
|
|
|
|
|
|
|
COALESCE can take an arbitrary number of arguments.
|
|
|
|
|
|
|
|
|
|
*Output*: one of the expressions or `null`
|
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
|
|
|
|
Returns the first of its arguments that is not null.
|
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-25 09:22:59 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[coalesceReturnNonNull]
|
2018-11-20 19:43:05 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-25 09:22:59 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[coalesceReturnNull]
|
2018-11-20 19:43:05 -05:00
|
|
|
|
----
|
2018-11-21 11:07:07 -05:00
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-greatest]]
|
|
|
|
|
==== `GREATEST`
|
2018-11-21 11:07:07 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-21 11:07:07 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
GREATEST(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression, <2>
|
|
|
|
|
...)
|
2018-11-21 11:07:07 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
...
|
2018-11-21 11:07:07 -05:00
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
**N**th expression
|
|
|
|
|
|
|
|
|
|
GREATEST can take an arbitrary number of arguments and
|
|
|
|
|
all of them must be of the same data type.
|
|
|
|
|
|
|
|
|
|
*Output*: one of the expressions or `null`
|
2018-11-21 11:07:07 -05:00
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
Returns the argument that has the largest value which is not null.
|
2018-11-21 11:07:07 -05:00
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[greatestReturnNonNull]
|
2018-11-21 11:07:07 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[greatestReturnNull]
|
2018-11-21 11:07:07 -05:00
|
|
|
|
----
|
2018-11-21 17:15:10 -05:00
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-ifnull]]
|
|
|
|
|
==== `IFNULL`
|
2018-11-21 17:15:10 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-21 17:15:10 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
IFNULL(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression) <2>
|
2018-11-21 17:15:10 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*Output*: 2nd expression if 1st expression is null, otherwise 1st expression.
|
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
|
|
|
|
Variant of <<sql-functions-conditional-coalesce>> with only two arguments.
|
|
|
|
|
Returns the first of its arguments that is not null.
|
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[ifNullReturnFirst]
|
2018-11-21 17:15:10 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[ifNullReturnSecond]
|
2018-11-21 17:15:10 -05:00
|
|
|
|
----
|
2018-11-22 05:41:00 -05:00
|
|
|
|
|
2019-04-23 09:30:37 -04:00
|
|
|
|
[[sql-functions-conditional-iif]]
|
|
|
|
|
==== `IFF`
|
|
|
|
|
|
|
|
|
|
.Synopsis:
|
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-23 14:19:26 -04:00
|
|
|
|
IIF(expression, <1>
|
|
|
|
|
expression, <2>
|
|
|
|
|
[expression]) <3>
|
2019-04-23 09:30:37 -04:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> boolean condition to check
|
|
|
|
|
|
|
|
|
|
<2> return value if the boolean condition evaluates to `true`
|
|
|
|
|
|
|
|
|
|
<3> return value if the boolean condition evaluates `false`; optional
|
|
|
|
|
|
|
|
|
|
*Output*: 2nd expression if 1st expression (condition) evaluates to `true`. If it evaluates to `false`
|
|
|
|
|
return 3rd expression. If 3rd expression is not provided return `null`.
|
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
|
|
|
|
Conditional function that implements the standard _IF <condition> THEN <result1> ELSE <result2>_
|
|
|
|
|
logic of programming languages. If the 3rd expression is not provided and the condition evaluates to `false`,
|
|
|
|
|
`null` is returned.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[iifWithDefaultValue]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[iifWithoutDefaultValue]
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
[TIP]
|
|
|
|
|
=================
|
|
|
|
|
*IIF* functions can be combined to implement more complex logic simulating the <<sql-functions-conditional-case>>
|
|
|
|
|
expression. E.g.:
|
|
|
|
|
|
|
|
|
|
[source, sql]
|
|
|
|
|
IIF(a = 1, 'one', IIF(a = 2, 'two', IIF(a = 3, 'three', 'many')))
|
|
|
|
|
=================
|
|
|
|
|
|
2018-11-22 05:41:00 -05:00
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-isnull]]
|
|
|
|
|
==== `ISNULL`
|
2018-11-22 05:41:00 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-22 05:41:00 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
ISNULL(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression) <2>
|
2018-11-22 05:41:00 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*Output*: 2nd expression if 1st expression is null, otherwise 1st expression.
|
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
|
|
|
|
Variant of <<sql-functions-conditional-coalesce>> with only two arguments.
|
|
|
|
|
Returns the first of its arguments that is not null.
|
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[isNullReturnFirst]
|
2018-11-22 05:41:00 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[isNullReturnSecond]
|
2018-11-22 05:41:00 -05:00
|
|
|
|
----
|
2018-11-23 16:19:27 -05:00
|
|
|
|
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-least]]
|
|
|
|
|
==== `LEAST`
|
2018-11-23 16:19:27 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-23 16:19:27 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
LEAST(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression, <2>
|
|
|
|
|
...)
|
2018-11-23 16:19:27 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
...
|
2018-11-23 16:19:27 -05:00
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
**N**th expression
|
|
|
|
|
|
|
|
|
|
LEAST can take an arbitrary number of arguments and
|
|
|
|
|
all of them must be of the same data type.
|
|
|
|
|
|
|
|
|
|
*Output*: one of the expressions or `null`
|
2018-11-23 16:19:27 -05:00
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
Returns the argument that has the smallest value which is not null.
|
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
2018-11-23 16:19:27 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[leastReturnNonNull]
|
2018-11-23 16:19:27 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[leastReturnNull]
|
2018-11-23 16:19:27 -05:00
|
|
|
|
----
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-nullif]]
|
|
|
|
|
==== `NULLIF`
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-26 12:21:36 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
NULLIF(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression) <2>
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
*Output*: `null` if the 2 expressions are equal, otherwise the 1st expression.
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
Returns `null` when the two input expressions are equal and
|
|
|
|
|
if not, it returns the 1st expression.
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[nullIfReturnFirst]
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[nullIfReturnNull]
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
[[sql-functions-conditional-nvl]]
|
|
|
|
|
==== `NVL`
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
2018-12-21 16:25:54 -05:00
|
|
|
|
.Synopsis:
|
2018-11-26 12:21:36 -05:00
|
|
|
|
[source, sql]
|
|
|
|
|
----
|
2019-04-16 13:47:39 -04:00
|
|
|
|
NVL(
|
|
|
|
|
expression, <1>
|
|
|
|
|
expression) <2>
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
*Input*:
|
|
|
|
|
|
|
|
|
|
<1> 1st expression
|
|
|
|
|
|
|
|
|
|
<2> 2nd expression
|
|
|
|
|
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
*Output*: 2nd expression if 1st expression is null, otherwise 1st expression.
|
2018-11-26 12:21:36 -05:00
|
|
|
|
|
|
|
|
|
.Description
|
|
|
|
|
|
2019-03-27 11:18:14 -04:00
|
|
|
|
Variant of <<sql-functions-conditional-coalesce>> with only two arguments.
|
|
|
|
|
Returns the first of its arguments that is not null.
|
2018-11-26 12:21:36 -05:00
|
|
|
|
If all arguments are null, then it returns `null`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[nvlReturnFirst]
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
["source","sql",subs="attributes,callouts,macros"]
|
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
include-tagged::{sql-specs}/docs/docs.csv-spec[nvlReturnSecond]
|
2018-11-26 12:21:36 -05:00
|
|
|
|
----
|
2019-03-27 11:18:14 -04:00
|
|
|
|
|
|
|
|
|
|