Expressions, Functions and Operators
Hazelcast supports a subset of standard SQL expressions, functions, and operators as well as non-standard functions for special cases such as windowed aggregation.
For information about input and return data types, see Data Types.
Operators
Operators are used to evaluate and/or compare one or more operands. For example, in the expression (X + Y), the +
operator evaluates the addition of the X
and Y
operands.
Hazelcast supports the following SQL operators.
Logical Operators
Hazelcast supports the AND
, OR
, and NOT
logical operators. Logical operators allow only BOOL
or NULL
data types as input. The result can be TRUE
, FALSE
, or NULL
:
X | Y | X AND Y | X OR Y |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X | NOT Y |
---|---|
|
|
|
|
|
|
Comparison Operators
Comparison operators compare two or more operands, and always return a BOOL
. Comparisons require operands to be of comparable type.
Operator name | Syntax | Description |
---|---|---|
Less Than |
|
Returns |
Less Than or Equal To |
|
Returns |
Greater Than |
|
Returns |
Greater Than or Equal To |
|
Returns |
Equal |
|
Returns |
Not Equal |
|
Returns |
|
Returns |
|
|
|
Returns
To escape a special character, use the |
|
See |
EXISTS
Operator
The EXISTS
operator returns TRUE
if a given subquery returns one or more records.
The NOT
keyword inverts the result.
Syntax
The EXISTS
operator supports the following syntax:
[NOT] EXISTS (<query>)
IS
Operator
The IS
operator returns TRUE
or FALSE
for a given condition. This operator never returns NULL
.
The NOT
keyword inverts the result.
Syntax | Description |
---|---|
|
Returns |
|
Returns |
|
Returns |
IN
Operator
The IN
operator allows you to check for a certain value in a given set of values, and returns TRUE
if an equal value is found.
The NOT
keyword inverts the result.
At the moment, Hazelcast does not support subqueries in IN clauses. For example, you cannot do SELECT column_names FROM table_name
WHERE column_name IN (SELECT STATEMENT);
|
Syntax
The IN
operator supports the following syntax:
<search_value> [NOT] IN (<value_set>)
UNION
and UNION ALL
Operators
The UNION
operator is used to combine the result set of two or more SELECT
statements, excluding any duplicate values.
The UNION ALL
operator is used to combine the result set of two or more SELECT
statements, including any duplicate values.
UNION ALL typically performs much better, because duplicate elimination is an expensive operation. Use UNION only if you actually need to remove duplicates.
|
Syntax
The UNION
and UNION ALL
Operators support the following syntax:
<query> UNION [ALL] <query>
Conditional Expressions
Conditional expressions allow you to evaluate only certain output values, depending on given conditions.
CASE
The CASE
expression evaluates the condition of each WHEN
clause and returns the first result where the condition is TRUE
. If all conditions are FALSE
or NULL
, the result of the ELSE
clause is returned.
Each condition
must be a boolean expression.
Syntax
The CASE
expression has two forms:
CASE value
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE elseResult
END
This form for returns result1
, when value = value1
, result2
when value = value2
and elseResult
, if value
isn’t equal to any of the values in the WHEN
clause.
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE elseResult
END
This form returns result1
when condition1
is TRUE
, result2
when condition2
is TRUE
and elseResult
, if no condition evaluated to TRUE
.
NULLIF
The NULLIF
expression returns NULL
if the two operands are equal and returns the first operand, if operands are not equal. The data type of the returned NULL
value is the same as the X
expression.
Syntax
NULLIF(X, Y)
Examples
sql> SELECT NULLIF('foo', 'bar');
+--------------------+
|EXPR$0 |
+--------------------+
|foo |
+--------------------+
1 row(s) selected
sql> SELECT NULLIF('foo', 'foo');
+--------------------+
|EXPR$0 |
+--------------------+
|NULL |
+--------------------+
Aggregate Functions
Aggregate functions perform calculations such as returning the mean of all data in a particular row.
Function :: Returns | Description |
---|---|
|
Calculates the number of input rows. |
|
Calculates the number of input rows in which the field is not null. |
|
Calculates the number of distinct values of the given field (ignores the |
|
Calculates the sum of the non-null input values. |
|
Calculates the mean of all the non-null input values. |
|
Calculates the minimum of the non-null input values. Applicable also to |
|
Calculates the maximum of the non-null input values. Applicable also to |
You can use DISTINCT keyword with all aggregate functions. It causes that before calculating the aggregate, duplicates are removed from the set of input values. For example, SUM(DISTINCT) applied to input values 1, 1, 2 will produce 3 , because it will add the 1 only once.
|
For examples of how to use aggregate functions, see the SELECT
statement documentation.
Conversion Functions
Conversion functions allow you to convert the result type of one expression to another explicit type.
CAST
Function | Description | Example | Result |
---|---|---|---|
|
Converts the result type of |
|
|
TO_CHAR
|
Converts a number or date to a string. |
|
|
The following are the detailed specifications for the formatting and modifiers of the TO_CHAR
function.
Pattern | Description |
---|---|
|
Hours of the day (1–12) |
|
Hours of the day (0-23) |
|
Minutes of the hour (0-59) |
|
Seconds of the minute (0-59) |
|
Milliseconds (0-999) |
|
Microseconds (0-999999) |
|
Tenth of a second (0-9) |
|
Hundredth of a second (0-99) |
|
Tenth of a millisecond (0-9999) |
|
Hundredth of a millisecond (0-9999) |
|
Seconds past midnight (0-86399) |
|
Meridiem indicator (without periods) |
|
Meridiem indicator (with periods) |
|
Year of the era (four or more digits) with comma |
|
Year of the era (four or more digits) |
|
Last three digits of the year of the era |
|
Last two digits of the year of the era |
|
Last digit of the year of the era |
|
ISO 8601 week-numbering year (4 or more digits) |
|
Last three digits of the ISO 8601 week-numbering year |
|
Last two digits of the ISO 8601 week-numbering year |
|
Last digit of the ISO 8601 week-numbering year |
|
Era indicator (without periods) |
|
Era indicator (with periods) |
|
Full uppercase month name (space-padded to nine chars) |
|
Full capitalized month name (space-padded to nine chars) |
|
Full lowercase month name (space-padded to nine chars) |
|
Abbreviated uppercase month name (three chars in English, localized lengths vary) |
|
Abbreviated capitalized month name (three chars in English, localized lengths vary) |
|
Abbreviated lowercase month name (three chars in English, localized lengths vary) |
|
Month number (1–12) |
|
Full uppercase day name (space-padded to nine chars) |
|
Full capitalized day name (space-padded to nine chars) |
|
Full lowercase day name (space-padded to nine chars) |
|
Abbreviated uppercase day name (three chars in English, localized lengths vary) |
|
Abbreviated capitalized day name (three chars in English, localized lengths vary) |
|
Abbreviated lowercase day name (three chars in English, localized lengths vary) |
|
Day of the year (1–366) |
|
Day of the ISO 8601 week-numbering year (1–371; day one of the year is Monday of the first ISO week) |
|
Day of the month (1–31) |
|
Day of the week, Monday (1) to Sunday (7) |
|
ISO 8601 day of the week, Monday (1) to Sunday (7) |
|
Week of the month (1–5) (the first week starts on the first day of the month) |
|
Week number of the year (1–53) (the first week starts on the first day of the year) |
|
Week number of the ISO 8601 week-numbering year (1–53; the first Thursday of the year is in week one) |
|
Century of the era (two digits) (the 21st century starts on 2001-01-01) |
|
Julian Date (integer days since November 24, 4714 BC at local midnight) |
|
Quarter of the year (1-4) |
|
Year of the era in uppercase Roman numerals |
|
Year of the era in lowercase Roman numerals |
|
Month number in uppercase Roman numerals (I–XII) |
|
Month number in lowercase Roman numerals (i–xii) |
|
Day of the month in uppercase Roman numerals (I–XXXI) |
|
Day of the month in lowercase Roman numerals (i–xxxi) |
|
Uppercase time-zone abbreviation, for example, GMT, UTC |
|
Lowercase time-zone abbreviation, for example, gmt, utc |
|
Time-zoned hours, for example, +3 |
|
Time-zones minutes (0-59) |
|
Time-zoned offset from UTC, for example, +03:00 |
Modifier | Description |
---|---|
|
Enable the fill mode (suppress padding) |
|
Uppercase ordinal number suffix (English only) |
|
Lowercase ordinal number suffix (English only) |
Pattern | Description |
---|---|
|
Digit position (can be dropped if insignificant) |
|
Digit position (will not be dropped, even if insignificant) |
|
Decimal separator |
|
Localized decimal separator |
|
Grouping separator |
|
Localized grouping separator |
|
Shift specified number of digits, for example, V99 = x102 |
|
Uppercase ordinal suffix for the integer part (English only) |
|
Lowercase ordinal suffix for the integer part (English only) |
|
Exponent for scientific notation, for example, E+03, x10^+03 |
|
Lowercase exponent for scientific notation, for example, e+03, x10^+03 |
|
Uppercase Roman numeral for the integer part |
|
Lowercase Roman numeral for the integer part |
Fixed | Anchored | Description |
---|---|---|
|
|
Negative value in angle brackets |
|
|
Sign |
|
|
Minus sign if number is negative |
|
|
Plus sign if number is non-negative |
|
|
Currency symbol or ISO 4217 currency code |
The format string consists of the integer and fraction parts, which are split at the first decimal separator, or just after the last digit position, or the end of the format string depending on availability. The order of processing is right to left in the integer part and left to right in the fraction part.
If the format string contains the EEEE
or eeee
patterns, it is said to be in the exponential form, in which no overflow is possible unless the number is
infinite. If it contains the RN
or rn
patterns and no digit positions, it is in the Roman form, in which there is an overflow unless the number is between 1 (inclusive) and 4000 (exclusive).
Otherwise, the format string is in the normal form, in which the number overflows only if it requires more digit positions than specified for the integer part.
In this form, the RN
and rn
patterns format the integer part if the absolute value of the number is less than 4000; otherwise, they switch to the overflow mode.
In an overflow:
-
the digit positions print a single hash (
#
) -
the
EEEE
andeeee
patterns print+##
as the exponent -
the
RN
andrn
patterns print 15 hashes -
the
TH
andth
patterns print two spaces if the number is infinite.The other patterns print what they print when there is no overflow. Note that NaN (not-a-number) is considered positive.
In the normal and exponential forms, if there is no negative sign provision and there is at
least one digit position, an M
pattern is prepended to the integer part. Similarly,
if only one part has the BR
and/or B
patterns, the latest bracket in the order
of processing is inserted to the opposite part. The inferred sign is inserted so that it
encloses all non-fixed patterns in the part to which it is inserted.
Lowercase variants of patterns are also accepted. If there is no special meaning of the lowercase variant, it has the same effect as its uppercase version.
The FM
pattern enables the fill mode, which suppresses padding.
-
In date formats:
-
If padding is enabled, numeric fields are left-padded with zeros and textual fields are left-padded with spaces.
-
The padding space is printed immediately, that is, it is not possible to float the fields to one side.
-
-
In numeric formats:
-
If padding is enabled; the
9
pattern prints a single space if it corresponds to a leading/trailing zero, decimal/grouping separators print a single space if they are not in between digits, theTH
pattern prints two spaces if the number is infinite, theRN
pattern pads the Roman numeral to meet 15 characters, theBR
pattern prints two spaces if the number is non-negative, and theMI
/PL
patterns print a single space if the number is non-negative/negative respectively. -
The padding space is not printed until a fixed pattern or the end of the format string is encountered. As a result, unfixed, or anchored, patterns float right within the extra space in the integer part and float left in the fraction part. Digit positions and decimal/grouping separators cannot float for obvious reasons, but they are considered "transparent" while anchoring other patterns.
-
Zero-padding and space-padding are completely orthogonal, which makes it possible to have zero-padded fractions, which are aligned at the decimal separator. However, this requires the last digit of the fraction part to be
0
if the Postgres convention is desired.
-
Consecutive unrecognized characters are interpreted as a literal. It is
also possible to specify a literal by enclosing zero or more characters within double
quotes. If the format string ends before an opening quote is paired, a closing quote is
assumed just after the last character. If a double quote is to be printed, it must be
escaped with a leading backslash. In general, escaping a character causes it to lose its
special meaning if any. In numeric formats, literals are anchored by default. To fix its
position, a literal should be prepended with an F
pattern, for example, F$
, F"USD"
.
Date and Time Functions
Function | Description | Example | Result |
---|---|---|---|
|
Returns the Supported elements: Supported temporal types: |
|
24 |
|
Converts a The actual time unit of the conversion is determined by the magnitude of the input value:
This logic causes that any time value between years 1971 up to year 2968 is converted using the correct time unit. Negative values are always converted as seconds. |
|
1970-01-01T03:00:01+03:00 1970-01-01T03:00:02+03:00 1970-01-01T03:00:03+03:00 |
|
Converts |
|
1645484400000 |
|
Converts a number or date to a string |
|
|
File Table Functions
To execute an ad-hoc query against data in files you can use one of the following table functions:
-
csv_file
-
json_flat_file
-
avro_file
-
parquet_file
File table functions create a temporary mapping to a file, which is valid for the duration of the query. These functions accept the same options as those available for the file connector.
To configure the temporary mapping, you can use either positional arguments or named arguments:
SELECT * FROM TABLE(
CSV_FILE('/path/to/directory', '*.csv', MAP['key', 'value'])
);
SELECT * FROM TABLE(
CSV_FILE(path => '/path/to/directory', options => MAP['key', 'value'])
);
JSON Functions
Hazelcast supports the following functions, which can retrieve JSON data.
JSON_QUERY
The JSON_QUERY()
function extracts a JSON value from a JSON document or a JSON-formatted string that matches a given JsonPath expression.
Syntax
JSON_QUERY(jsonArg:{VARCHAR | JSON}, jsonPath:VARCHAR [<wrapperBehavior>] [<onClauseArg> ON ERROR] [<onClauseArg> ON EMPTY])` :: JSON
-
jsonArg
: JSON value or a JSON-formatted string. -
jsonPath
: A JsonPath expression that identifies the data that you want to get from thejsonArg
parameter. -
wrapperBehavior
: What to do with return results.-
WITHOUT [ARRAY] WRAPPER
(default): Up to one matched value is returned without wrapping in an array. Fails, if multiple values match. -
WITH [CONDITIONAL] [ARRAY] WRAPPER
: Returns a single match directly without wrapping. If there are multiple matches, they are returned as a JSON array. -
WITH UNCONDITIONAL [ARRAY] WRAPPER
: Always wrap matched values in a JSON array.
-
-
onClauseArg
: A value to return in case of the givenON
condition:-
EMPTY ARRAY
-
EMPTY OBJECT
-
ERROR
-
NULL
-
Examples
SELECT
JSON_QUERY('{"company" : {"employees" : [{"id" : "1"}]}}', '$.company.employees[0]');
-- Result
-- {"id":"1"}
SELECT
JSON_QUERY('[1,2,3]', '$[*]?(@ > 1)' WITH CONDITIONAL ARRAY WRAPPER);
-- Result
-- [2,3]
SELECT
JSON_QUERY('[1,2,3]', '$[*]?(@ > 1)' WITHOUT ARRAY WRAPPER);
-- Result
-- This example throws an error because you cannot return multiple values without an array wrapper.
SELECT
JSON_QUERY('[1,"rainbow",3]', '$[1]' WITH UNCONDITIONAL ARRAY WRAPPER);
-- Result
-- ["rainbow"]
JSON_VALUE
The JSON_VALUE()
function extracts a primitive value, such as a string, number, or boolean that matches a given JsonPath expression. This function returns NULL
if a non-primitive value is matched, unless the ON ERROR
behavior is changed.
Syntax
JSON_VALUE(jsonArg:{VARCHAR | JSON}, jsonPath:VARCHAR [RETURNING dataType] [<onClauseArg> ON ERROR] [<onClauseArg> ON EMPTY])` :: VARCHAR
-
jsonArg
: JSON value or a JSON-formatted string -
jsonPath
: A JsonPath expression that identifies the data that you want to get from thejsonArg
parameter. -
RETURNING
: Converts the result to thedataType
(VARCHAR
by default). If the value cannot be converted to the target type, throws an error. -
onClauseArg
: What to return in case of theON
condition:-
DEFAULT <literal | column | parameter>
-
ERROR
-
NULL
-
Examples
SELECT
JSON_VALUE('{"company" : {"employees" : [{"id" : "1","name":"jake"}]}}', '$.company.employees[0].id');
-- Returns
-- 1 (as a VARCHAR)
JSON_ARRAY
The JSON_ARRAY()
function returns a JSON array from a list of input data.
Syntax
JSON_ARRAY([columnOrParameterOrLiteral:ANY], [...more columns/parameters/literals:ANY] [{ABSENT|NULL} ON NULL]) :: JSON
-
columnOrParameterOrLiteral
: A list of input data. -
ON NULL
: What to do with null values:-
ABSENT ON NULL
(default): Do not includeNULL
values in the array. -
NULL ON NULL
: IncludeNULL
values in the array.
-
Examples
SELECT
JSON_ARRAY(1, null, 3);
-- Result
-- [1,3]
JSON_OBJECT
The JSON_OBJECT()
function returns a JSON object from the given key/value pairs.
Syntax
JSON_OBJECT([key : value] [, ...] [{ABSENT|NULL} ON NULL]) :: JSON
Or
JSON_OBJECT([[KEY] key VALUE value] [{ABSENT|NULL} ON NULL]) :: JSON
-
key
: A name for the key, must be a VARCHAR -
value
: A value for the key, can be any type. -
ON NULL
: What to do withNULL
values.-
NULL ON NULL (default): Include `NULL
values in the array. -
ABSENT ON NULL
: Do not includeNULL
values in the array.
-
Examples
SELECT JSON_OBJECT(KEY 'id' VALUE 1, 'name' VALUE null ABSENT ON NULL)
-- Result
-- {"id": 1}
SELECT JSON_OBJECT('id': 1, 'name': 'jake')
-- Result
-- {"id": 1, "name":"jake"}
JSON_ARRAYAGG
The JSON_ARRAYAGG()
returns a JSON array containing an element for each value in a given set of SQL values. It takes as its input a column of SQL expressions, converts each expression to a JSON value, and returns a single JSON array that contains those JSON values.
Syntax
JSON_ARRAY(value [ORDER BY value {ASC|DESC}] [{ABSENT|NULL} ON NULL]) :: JSON
-
value
: A value for the key, can be any type. -
ON NULL
: What to do with null values:-
ABSENT ON NULL
(default): Do not includeNULL
values in the array. -
NULL ON NULL
: IncludeNULL
values in the array.
-
Examples
Assuming you have the following table:
name, number
--------
Alice, 1
Bob, 2
Alice, 3
Bob, 6
null, 7
SELECT name, JSON_ARRAYAGG(number ORDER BY number ASC) arr_no
FROM test GROUP BY name
-- Result
-- name, arr_no
-- ------------
-- Alice, [1, 3]
-- Bob, [2, 6]
-- null, [7]
JSON_OBJECTAGG
The JSON_OBJECTAGG()
function constructs an object member for each key-value pair and returns a single JSON object that contains those object members. It takes as
its input a property key-value pair. Typically, the property key, the property value, or both are columns of SQL expressions.
Syntax
JSON_OBJECTAGG([key : value] [, ...] [{ABSENT|NULL} ON NULL]) :: JSON
Or
JSON_OBJECTAGG([[KEY] key VALUE value] [{ABSENT|NULL} ON NULL]) :: JSON
-
key
: A name for the key, must be a VARCHAR -
value
: A value for the key, can be any type. -
ON NULL
: What to do withNULL
values.-
NULL ON NULL (default): Include `NULL
values in the array. -
ABSENT ON NULL
: Do not includeNULL
values in the array.
-
Examples
SELECT JSON_OBJECTAGG(KEY 'name' VALUE age) "Names"
FROM employees
WHERE age <= 30;
--Result
--{"Mary":28,"John":29,"Jake":27}
Mathematical Functions
Function | Description | Example | Result |
---|---|---|---|
|
Absolute value of the argument |
|
|
|
Returns the cube root of the input |
|
|
|
Returns the nearest integer greater than or equal to argument |
|
|
|
Converts radians to degrees |
|
|
|
Exponential |
|
|
|
Returns the nearest integer less than or equal to argument |
|
|
|
Natural logarithm |
|
|
|
Base 10 logarithm |
|
|
|
Returns the remainder of x / y |
|
|
|
Returns x to the power of y |
|
|
|
Converts degrees to radians |
|
|
|
Random value in the range [0.0; 1.0) |
|
|
|
Random value in the range [0.0; 1.0) using the given seed |
|
|
|
Rounds to an integer |
|
|
|
Rounds to |
|
|
|
Returns -1, 0 or 1 for negative, zero or positive argument, respectively |
|
|
|
Squares the input |
|
|
|
Returns the square root of the input |
|
|
|
Truncates to an integer |
|
|
|
Truncates to |
|
|
|
Converts a number or date to a string |
|
|
String Functions
Function | Description | Example | Result |
---|---|---|---|
|
Concatenates two strings |
|
|
|
Returns the ASCII code of the first character of the argument |
|
|
|
Equivalent to |
||
|
Returns a string that consists of the arguments |
|
John-Doe |
|
Converts the first letter of each word to upper case, and the rest to lower case |
|
|
|
Length of the string |
|
|
|
Converts the string to lower case |
|
|
|
Removes the empty spaces from the left-hand side of |
|
|
|
Returns the position of the first occurrence of |
|
|
|
Replaces all occurrences of |
|
|
|
Removes the empty spaces from the right-hand side of |
|
|
|
Extracts a substring starting with the given position |
|
|
|
Extracts a substring starting with the given position for the given length |
|
|
|
Removes |
|
|
|
Equivalent to |
|
|
|
Equivalent to |
|
|
|
Converts a string to upper case |
|
|
Table-Valued Functions
Table-valued functions return tables of batch or streaming sources that you can use in SQL statements.
Function | Description |
---|---|
|
Returns a table that contains a series of numbers, starting from the |
|
Returns a table that contains a stream of numbers, starting from 0 at a rate of |
To use a table-valued function in FROM clause, you must wrap it in a TABLE
keyword. For example:
SELECT *
FROM TABLE(generate_series(1, 3));
Trigonometric Functions
Function | Description |
---|---|
|
Inverse cosine |
|
Inverse sine |
|
Inverse tangent |
|
Arc tangent |
|
Cosine |
|
Cotangent |
|
Sine |
|
Tangent |
Windowing Table-Valued Functions
Windowing functions assign input records from the input table into windows. Their output contains all the input columns, with two added columns: window_start
and window_end
. You can use the added columns in the GROUP BY
expression when doing streaming aggregation.
For a guide about streaming windowed aggregations in SQL, see Stream Processing in SQL.
Function | Description |
---|---|
|
Assigns input records to tumbling windows. |
|
Assigns input records to hopping windows. |