Template functions¶
The following template functions are available. You can use them in datafiles to accomplish different tasks. See Advanced templates for more information on templating.
defined¶
Checks whether a variable is defined.
defined function
% SELECT date FROM my_table {% if defined(param) %} WHERE ... {% end %}
column¶
Retrieves the column by its name from a variable.
column function
% {% set var_1 = 'name' %} SELECT {{column(var_1)}} FROM my_table
columns¶
Retrieves columns by their name from a variable.
columns function
% {% set var_1 = 'name,age,address' %} SELECT {{columns(var_1)}} FROM my_table
date_diff_in_seconds¶
Returns the absolute value of the difference in seconds between two DateTime
. See DateTime.
The function accepts the following parameters:
date_1
: the first date or DateTime.date_2
: the second date or DateTime.date_format
: (optional) the format of the dates. Defaults to'%Y-%m-%d %H:%M:%S'
, so you can passDateTime
asYYYY-MM-DD hh:mm:ss
when calling the function.backup_date_format
: (optional) the format of the dates if the first format doesn't match. Use it when your default input format is a DateTime (2022-12-19 18:42:22
) but you receive a date instead (2022-12-19
).none_if_error
: (optional) whether to returnNone
if the dates don't match the provided formats. Defaults toFalse
. Use it to provide an alternate logic in case any of the dates are specified in a different format.
An example of how to use the function:
date_diff_in_seconds('2022-12-19T18:42:23.521Z', '2022-12-19T18:42:23.531Z', date_format='%Y-%m-%dT%H:%M:%S.%fz')
The following example shows how to use the function in a datafile:
date_diff_in_seconds function
% SELECT date, events {% if date_diff_in_seconds(date_end, date_start, date_format="%Y-%m-%dT%H:%M:%Sz") < 3600 %} FROM my_table_raw {% else %} FROM my_table_hourly_agg {% end %} WHERE date BETWEEN parseDateTimeBestEffort({{String(date_start,'2023-01-11T12:24:04Z')}}) AND parseDateTimeBestEffort({{String(date_end,'2023-01-11T12:24:05Z')}})
See working with time for more information on how to work with time in Tinybird.
date_diff_in_minutes¶
Same behavior as date_diff_in_seconds, but returns the difference in minutes.
date_diff_in_hours¶
Same behavior as date_diff_in_seconds, but returns the difference in hours.
date_diff_in_days¶
Returns the absolute value of the difference in days between two dates or DateTime.
date_diff_in_days function
% SELECT date FROM my_table {% if date_diff_in_days(date_end, date_start) < 7 %} WHERE ... {% end %}
date_format
is optional and defaults to '%Y-%m-%d
, so you can pass DateTime as YYYY-MM-DD
when calling the function.
As with date_diff_in_seconds
, date_diff_in_minutes
, and date_diff_in_hours
, other date_formats are supported.
split_to_array¶
Splits comma separated values into an array. The function accepts the following parameters:
split_to_array(arr, default, separator=',')
arr
: the value to split.default
: the default value to use ifarr
is empty.separator
: the separator to use. Defaults to,
.
The following example splits code
into an array of integers:
split_to_array function
% SELECT arrayJoin(arrayMap(x -> toInt32(x), {{split_to_array(code, '')}})) as codes FROM my_table
The following example splits param
into an array of strings using |
as the custom separator:
split_to_array with a custom separator function
% SELECT {{split_to_array(String(param, 'hi, how are you|fine thanks'), separator='|')}}
enumerate_with_last¶
Creates an iterable array, returning a boolean value that allows to check if the current element is the last element in the array. You can use it alongside the split_to_array function.
symbol¶
Retrieves the value of a variable. The function accepts the following parameters:
symbol(x, quote)
For example:
enumerate_with_last function
% SELECT {% for _last, _x in enumerate_with_last(split_to_array(attr, 'amount')) %} sum({{symbol(_x)}}) as {{symbol(_x)}} {% if not _last %}, {% end %} {% end %} FROM my_table
sql_and¶
Creates a list of "WHERE" clauses, along with "AND" separated filters, that checks if a field (<column>) is or isn't (<op>) in a list/tuple (<transform_type_function>).
The function accepts the following parameters:
sql_and(<column>__<op>=<transform_type_function> [, ...] )
<column>
: any column in the table.<op>
: one of:in
,not_in
,gt
(>),lt
(<),gte
(>=),lte
(<=)<transform_type_function>
: any of the transform type functions (Array(param, 'Int8')
,String(param)
, etc.). If one parameter isn't specified, then the filter is ignored.
For example:
sql_and function
% SELECT * FROM my_table WHERE 1 {% if defined(param) or defined(param2_not_in) %} AND {{sql_and( param__in=Array(param, 'Int32', defined=False), param2__not_in=Array(param2_not_in, 'String', defined=False))}} {% end %}
If this is queried with param=1,2
and param2_not_in=ab,bc,cd
, it translates to:
sql_and function - generated sql
SELECT * FROM my_table WHERE 1 AND param IN [1,2] AND param2 NOT IN ['ab','bc','cd']
If this is queried with param=1,2
only, but param2_not_in
isn't specified, it translates to:
sql_and function - generated sql param missing
SELECT * FROM my_table WHERE 1 AND param IN [1,2]
Transform types functions¶
The following functions validate the type of a template variable and cast it to the desired data type. They also provide a default value if no value is passed.
Boolean(x)
DateTime64(x)
DateTime(x)
Date(x)
Float32(x)
Float64(x)
Int8(x)
Int16(x)
Int32(x)
Int64(x)
Int128(x)
Int256(x)
UInt8(x)
UInt16(x)
UInt32(x)
UInt64(x)
UInt128(x)
UInt256(x)
String(x)
Array(x)
Each function accepts the following parameters:
type(x, default, description=<description>, required=<true|false>)
x
: the parameter or value.default
: (optional) the default value to use ifx
is empty.description
: (optional) the description of the value.required
: (optional) whether the value is required.
For example, Int32
in the following query, lim
is the parameter to be cast to an Int32
, 10
is the default value, and so on:
transform_type_functions
% SELECT * FROM TR LIMIT {{Int32(lim, 10, description="Limit the number of rows in the response", required=False)}}