4.3
Expressions
Expressions are the parts of a Lenses SQL query that will be evaluated to single values.
Below is the complete list of expressions that Lenses SQL supports.
Literals
A literal is an expression that represents a concrete value of a given type. This means that there is no resolution needed for evaluating a literal and its value is simply what is specified in the query.
Integers
Integer numbers can be introduced in a Lenses SQL query using integer literals:
SELECT 1 + 2 FROM myTopic
In the above query 1, 2 are integer literals.
Decimals
Decimal number literals can be used to express constant floating-point numbers:
SELECT 3.14 as pi FROM myTopic
Strings
To express strings, string literals can be used. Single quotes (') and double quotes (") are both supported as delimiters:
SELECT CONCAT("hello ", 'world!') FROM myTopic
In the example above, "hello " and 'world!' are string literals.
Booleans
Boolean constant values can be expressed using the false and true boolean literals:
SELECT false, true FROM myTopic
Nulls
Sometimes it is necessary to the NULL literal in a query, for example to test that something is or is not null, or to put a NULL the value facet,
useful to delete records in a compacted topic:
INSERT INTO cleanedTopic
SELECT NULL as _value FROM myTopic WHERE myField IS NULL
Arrays
An array is a collection of elements of the same type.
Array expressions
A new array can be defined with the familiar [...] syntax:
["a", "b", "c"", "d"]
You can use more complex expressions inside the array:
[1 + 1, 7 * 2, COS(myfield)]
and nested arrays as well:
[["a"], ["b", "c"]]
Note: empty array literals like [] are currently not supported by LSQL. That will change in future versions.
Array selections
An element of a field containing an array can be extracted appending, to the array expression, a pair of square brackets containing the index of the element.
Example:
SELECT
  myArray[0],
  myArray[0 + 1]
FROM myTopic
More complex selections, like myNestedArray[0][1] are currently not supported. That will be fixed in future versions.
As a temporary workaround, the element_of function can be used:
SELECT
    element_of(element_of(myNestedArray, 0), 1)
FROM myTopic
Structs
A Struct is a value that is composed by fields and sub-values assigned to those fields. It is similar to what an object is in JSON.
In LSQL there are two ways of building new structs.
Nested aliases
In a SELECT projection, it is possible to use nested aliases to denote the fields of a struct.
In the next example, we are building a struct field called user, with two subfields, one that is a string,
and another one that is a struct:
SELECT
    myName as user.name,
    "email" as user.contact.type,
    CONCAT(myName, "@lenses.io") as user.contact.value
FROM myTopic
When the projection will be evaluated, a new struct user will be built.
The result will be a struct with a name field, and a nested struct assigned to the contact field,
containing type and value subfields.
Struct Selections
A selection is an explicit reference to a field within a struct.
The syntax for a selection is as follows:
[<named_source>.][<facet>.]<field_name>
Selections can be used to directly access a field of a facet, optionally specifying the topic and the facet:
SELECT
    myField,                 -- value facet field, with implicit topic and facet
    myTopic.myField,         -- value facet field, with explicit topic and implicit facet
    _value.myField,          -- value facet field, with implicit topic and explicit facet
    myTopic._value.myField,  -- value facet field, with explicit topic and facet
    _key.myKeyField,         -- key facet field, with implicit topic and explicit facet
    myTopic._key.myKeyField  -- key facet field, with explicit topic and facet
FROM
    myTopic
Special characters in field names
If there are special characters in the field names, backticks (`) can be used:
SELECT myStruct.`a field!` FROM myTopic
Binary Expressions
A binary expression is an expression that is composed of a left-hand side and a right-hand side sub-expressions and an operator that describes how the results of the sub-expressions are to be combined into a single result.
Currently, supported operators are:
- Logical operators: 
AND,OR - Arithmetic operators: 
+,-,*,/,%(mod) - Ordering operators: 
>,>=,<,<= - Equality operators: 
=,!= - String operators: 
LIKE,NOT LIKE - Inclusion operators: 
IN,NOT IN 
A binary expression is the main way to compose expressions into more complex ones.
For example, 1 + field1 and LENGTH(field2) > 5 are binary expressions, using the + and the >= operator respectively.
Case statements
CASE expressions return conditional values, depending on the evaluation of sub-expressions present in each of the
CASE’s branches. This expression is LSQL version of what other languages call a switch-statement or
if-elseif-else construct.
SELECT
    CASE
        WHEN field3 = "Robert" THEN "It's bobby"
        WHEN field3 = "William" THEN "It's willy"
        ELSE "Unknown"
        END AS who_is_it
FROM myTopic
Functions
A function is a predefined named operation that takes a number of input arguments and is evaluated into a result. Functions usually accept the result of other expressions as input arguments, so functions can be nested.
LSQL Streaming supports out-of-the-box a great number of different functions , and this set can be further expanded when User Defined Functions and User Defined Aggregated Functions ) are used.
