Complex expressions¶
Complex expressions are used to define SQL expressions. Complex expressions are converted into SQL code in run-time.
Where complex expressions can be utilized:
- in report filters;
- when working with ORM to avoid writing raw SQL (for developers)
Note for developers
It's possible to build expressions with Espo\ORM\Query\Part\Expression
class. See here.
In this article:
Functions¶
Function names should be in UPPER_CASE. You need to append a trailing colon character to a function name. There should not be any whitespace between function name and parentheses.
Examples
CONCAT:(firstName, ' ', lastName)
IF:(EQUAL:(status, 'Complete'), 'Complete', 'Not Complete')`
Functions:
Conditional¶
IF¶
E.g. IF:(a, '1', '0')
– if a is true, then return '1'; return '0' otherwise.
SWITCH¶
As of v7.4.
An equivalent of 'CASE WHEN ... THEN ... ELSE ... END'. Arguments on even-numbered positions define 'WHEN' conditions, while following arguments define corresponding 'THEN' values. The last unmatched argument defines 'ELSE'.
E.g. SWITCH:(EQUAL:(monthNumber, 1), 'Jan', EQUAL:(monthNumber, 2), 'Feb', EQUAL:(monthNumber, 3), 'Mar', 'Other')
.
MAP¶
As of v7.4.
An equivalent of 'CASE ... WHEN ... THEN ... ELSE ... END'. Arguments on odd-numbered positions define keys, while following arguments define mapped values. The last unmatched argument defines 'ELSE'.
E.g. MAP:(monthNumber, 1, 'Jan', 2, 'Feb', 3, 'Mar', 'Other')
.
Comparison¶
LIKE¶
Pattern matching.
E.g. LIKE:(name, 'Cloud%'
) will give true when 'name' is equal to 'Cloud Basic' or 'Cloud Enterprise'.
NOT_LIKE¶
Negation of LIKE.
EQUAL¶
Check whether two arguments are equal.
E.g. EQUAL:(status, 'Complete')
corresponds to SQL statement status = 'Complete'
.
NOT_EQUAL¶
Negation of equal.
GREATER_THAN¶
Check whether a > b.
E.g. GREATER_THAN:(amountConverted, 1000.00)
corresponds to SQL statement amountConverted > 100.00
.
LESS_THAN¶
Check whether a < b.
GREATER_THAN_OR_EQUAL¶
Check whether a >= b.
LESS_THAN_OR_EQUAL¶
Check whether a <= b.
IS_NULL¶
Check whether value is NULL.
E.g. IS_NULL:(sicCode)
– checks whether Sic Code field is not set.
IS_NOT_NULL¶
Negation of IS_NULL.
IN¶
Check whether a value is within a set of values.
E.g. IN:(stage, 'Closed Won', 'Closed Lost')
will return true if stage is 'Closed Won' or 'Closed Lost'.
NOT_IN¶
Negation of IN.
COALESCE¶
Returns the first non-NULL value in the list.
E.g. COALESCE:(dateStart, createdAt)
will return value of createdAt if dateStart is not set.
IFNULL¶
If the first argument is not NULL, it returns it; otherwise it returns the second argument.
E.g. IFNULL:(name, '')
will return empty string if name is NULL.
NULLIF¶
If the first argument equals the second, returns NULL, otherwise returns the first argument.
E.g. NULLIF:(name, '')
will return NULL if name is empty string.
GREATEST¶
As of v7.4.
Returns the max value from a list of expressions.
LEAST¶
As of v7.4.
Returns the min value from a list of expressions.
Date & time¶
MONTH_NUMBER¶
Month number. From 1 to 12.
WEEK_NUMBER_0¶
Week number. Sunday is a first day of week.
WEEK_NUMBER_1¶
Week number. Monday is a first day of week.
DAYOFWEEK¶
Number from 1 to 7.
DAYOFMONTH¶
Number from 1 to 31.
YEAR¶
Year number.
YEAR_X¶
Fiscal year number, where X is a number (between 1 and 12) of the fiscal year start. E.g. YEAR_3
.
HOUR¶
Number from 0 to 23.
MINUTE¶
Number from 0 to 59.
MONTH¶
Month number w/ year. E.g. 2019-05
.
QUARTER¶
Quarter number w/ year. E.g. 2019_1
.
QUARTER_X¶
Fiscal quarter number, where X is a number (between 1 and 12) of the fiscal year start. E.g. QUARTER_3
.
WEEK_0¶
Week number w/ a year. Sunday is a first day of week.
E.g. 2018/4
.
WEEK_1¶
Week number w/ a year. Monday as a first day of week.
NOW¶
Current date and time.
TZ¶
Time zone conversion.
E.g. TZ:(createdAt, -10.5)
will apply -10:30 offset.
UNIX_TIMESTAMP¶
UNIX timestamp of a date-time argument or a current timestamp if no argument passed.
TIMESTAMPDIFF_YEAR¶
Difference between two days in years.
E.g. TIMESTAMPDIFF_YEAR:(createdAt, modifiedAt)
.
TIMESTAMPDIFF_MONTH¶
Difference between two days in months.
TIMESTAMPDIFF_WEEK¶
Difference between two days in weeks.
TIMESTAMPDIFF_DAY¶
Difference between two days in days.
TIMESTAMPDIFF_HOUR¶
Difference between two days in hours.
TIMESTAMPDIFF_MINUTE¶
Difference between two days in minutes.
TIMESTAMPDIFF_SECOND¶
Difference between two days in seconds. Available since v6.0.0.
DATE¶
Returns a date part of a date-time value. Available since v6.0.0.
String¶
CONCAT¶
Concatenate. E.g. CONCAT:(firstName, ' ', lastName)
.
LEFT¶
Returns a specified number of characters from the left of the string. E.g. LEFT:(someTextColumn, 1000)
.
LOWER¶
Convert to lower case.
UPPER¶
Convert to upper case.
TRIM¶
Remove leading and trailing spaces.
CHAR_LENGTH¶
Number of characters in string.
BINARY¶
Converts a value to a binary string.
EQUAL:('test', 'Test')
returns true.
EQUAL:(BINARY:('test'), 'Test')
returns false.
REPLACE¶
Replaces all the occurrences of a substring within a string.
REPLACE:('haystack', 'needle', 'replaceWith')
Math¶
ADD¶
Addition. E.g. ADD:(2, 2)
corresponds to 2 + 2
.
SUB¶
Subtraction. E.g. SUB:(2, 1)
corresponds to 2 - 1
.
MUL¶
Multiplication. E.g. MUL:(2, 2)
corresponds to 2 * 2
.
DIV¶
Division. E.g. DIV:(2, 4)
corresponds to 2 / 4
.
MOD¶
Returns remainder of a number divided by another number. E.g. MOD:(6, 4)
corresponds to 6 % 4
.
FLOOR¶
The largest integer value not greater than the argument.
CEIL¶
The smallest integer value greater than or equal to the argument.
ROUND¶
Round a number to a specified number of decimal places. E.g. ROUND:(value, 2)
.
Logical¶
OR¶
E.g. OR:(a, b, c)
corresponds to SQL statement a OR b OR c
.
AND¶
E.g. AND:(a, b, c)
corresponds to SQL statement a AND b AND c
.
NOT¶
E.g. NOT:(a)
corresponds to SQL statement NOT a
.
Custom functions¶
It is possible to add custom functions. An implementation class name for a custom function should be defined in metadata by the path app > orm > platforms > {platform} > functionConverterClassNameMap > {function}. The class should implement Espo\ORM\QueryComposer\Part\FunctionConverter
interface.
Attribute names¶
Attribute names usually are same as system field names. Fields are listed under Administration > Entity Manager > {Entity Type} > Fields.
Attribute names should be in lowerCamelCase.
Field types having attributes named differently:
- Link: fieldId, fieldName.
- Link-Parent: fieldId, fieldType.
- Currency: field, fieldCurrency.
Where field is the name of the field.
More info about attributes here.