Search
ctrl/
Ask AI
Light
Dark
System

With

All top-level EdgeQL statements (select, insert, update, and delete) can be prefixed by a with block. These blocks contain declarations of standalone expressions that can be used in your query.

Copy
db> 
... 
with my_str := "hello world"
select str_title(my_str);
{'Hello World'}

The with clause can contain more than one variable. Earlier variables can be referenced by later ones. Taken together, it becomes possible to write “script-like” queries that execute several statements in sequence.

Copy
db> 
... 
... 
... 
with a := 5,
  b := 2,
  c := a ^ b
select c;
{25}

There’s no limit to the complexity of computed expressions. EdgeQL is fully composable; queries can simply be embedded inside each other. The following query fetches a list of all movies featuring at least one of the original six Avengers.

Copy
db> 
... 
... 
... 
... 
... 
... 
... 
... 
... 
with avengers := (select Hero filter .name in {
    'Iron Man',
    'Black Widow',
    'Captain America',
    'Thor',
    'Hawkeye',
    'The Hulk'
  })
select Movie {title}
filter avengers in .characters;
{

  default::Movie {title: 'Iron Man'},
  default::Movie {title: 'The Incredible Hulk'},
  default::Movie {title: 'Iron Man 2'},
  default::Movie {title: 'Thor'},
  default::Movie {title: 'Captain America: The First Avenger'},
  ...
}

A common use case for with clauses is the initialization of query parameters.

Copy
with user_id := <uuid>$user_id
select User { name }
filter .id = user_id;

For a full reference on using query parameters, see EdgeQL > Parameters.

By default, the active module is default, so all schema objects inside this module can be referenced by their short name, e.g. User, BlogPost, etc. To reference objects in other modules, we must use fully-qualified names (default::Hero).

However, with clauses also provide a mechanism for changing the active module on a per-query basis.

Copy
db> 
... 
with module schema
select ObjectType;

This with module clause changes the default module to schema, so we can refer to schema::ObjectType (a built-in EdgeDB type) as simply ObjectType.