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:

FeatureQL
SELECT 'Hello, World !'
;
Result
?_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:

FeatureQL
SELECT
    greeting := 'Hello, World !',
    three := 3
;
Result
GREETING VARCHARTHREE 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:

FeatureQL
SELECT
    'Hello, ' || 'World' || '!', -- Using the operator concat
    CONCAT('Hello, ', 'World', '!') -- Using the function CONCAT
;
Result
?_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:

FeatureQL
SELECT
    subject := 'World',
    salutation := 'Hello, ' || subject || '!',
    n := 1,
    n_plus_2 := n + 2
;
Result
SUBJECT VARCHARSALUTATION VARCHARN BIGINTN_PLUS_2 BIGINT
WorldHello, World!13

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:

@fql-playground(return_computed_case_insensitive)

SeLeCt, As, sUbJeCt — it all works. Use whatever casing convention your team prefers.

Last update at: 2026/05/26 17:22:09