Hello, World!
FeatureQL looks like SQL but works differently: you define features (named values) instead of selecting from tables. This page walks through the basics with interactive examples.
Returning values
The simplest query returns a literal value, just like SELECT 1 in SQL:
SELECT
'Hello, World !'
;| ?_0 VARCHAR |
|---|
| Hello, World ! |
Naming features
Give a name to a value and it becomes a feature — a reusable building block you can reference elsewhere in the query or persist for use across queries:
SELECT
greeting := 'Hello, World !',
three := 3
;| GREETING VARCHAR | THREE BIGINT |
|---|---|
| Hello, World ! | 3 |
Computing values
Features can be computed from operators and functions. Here, string concatenation is shown two ways — the || operator and the CONCAT() function — both produce the same result:
SELECT
'Hello, ' || 'World' || '!', -- Using the operator concat
CONCAT('Hello, ', 'World', '!')
;| ?_0 VARCHAR | ?_1 VARCHAR |
|---|---|
| Hello, World! | Hello, World! |
Referencing other features
Features can reference other features defined in the same query. No CTEs, no subqueries — just name a feature and use it. FeatureQL resolves the dependency graph automatically:
SELECT
subject := 'World',
salutation := 'Hello, ' || subject || '!',
n := 1,
n_plus_2 := n + 2
;| SUBJECT VARCHAR | SALUTATION VARCHAR | N BIGINT | N_PLUS_2 BIGINT |
|---|---|---|---|
| World | Hello, World! | 1 | 3 |
Notice that SALUTATION references SUBJECT, and N_PLUS_2 references N. The order you write them doesn't matter — FeatureQL figures out the evaluation order.
Case insensitivity
Keywords, feature names, and function names are all case insensitive:
SeLeCt
'World' As SuBjEcT,
'Hello, ' || sUbJeCt || '!',
n + 2,
1 aS n| SUBJECT VARCHAR | ?_1 VARCHAR | ?_2 BIGINT | N BIGINT |
|---|---|---|---|
| World | Hello, World! | 3 | 1 |
SeLeCt, As, sUbJeCt — it all works. Use whatever casing convention your team prefers.