CommonTableExpression

A common table expression that can be used with the GRDB query interface.

  • The table name of the common table expression.

    For example:

    // WITH answer AS (SELECT 42) ...
    let answer = CommonTableExpression(
        named: "answer",
        sql: "SELECT 42")
    answer.tableName // "answer"
    
  • Creates a common table expression from a request.

    For example:

    // WITH p AS (SELECT * FROM player) ...
    let p = CommonTableExpression<Void>(
        named: "p",
        request: Player.all())
    
    // WITH p AS (SELECT * FROM player) ...
    let p = CommonTableExpression<Void>(
        named: "p",
        request: SQLRequest<Player>(sql: "SELECT * FROM player"))
    
  • Creates a common table expression from an SQL string and optional arguments.

    For example:

    // WITH p AS (SELECT * FROM player WHERE name = 'O''Brien') ...
    let p = CommonTableExpression<Void>(
        named: "p",
        sql: "SELECT * FROM player WHERE name = ?",
        arguments: ["O'Brien"])
    
  • Creates a common table expression from an SQL literal.

    Literals allow you to safely embed raw values in your SQL, without any risk of syntax errors or SQL injection:

    // WITH p AS (SELECT * FROM player WHERE name = 'O''Brien') ...
    let name = "O'Brien"
    let p = CommonTableExpression<Void>(
        named: "p",
        literal: "SELECT * FROM player WHERE name = \(name)")
    
  • Creates a request for all rows of the common table expression.

    You can fetch from this request:

    // WITH answer AS (SELECT 42 AS value)
    // SELECT * FROM answer
    struct Answer: Decodable, FetchableRecord {
        var value: Int
    }
    let cte = CommonTableExpression<Answer>(
        named: "answer",
        sql: "SELECT 42 AS value")
    let answer = try cte.all().with(cte).fetchOne(db)!
    print(answer.value) // prints 42
    

    You can embed this request as a subquery:

    // WITH answer AS (SELECT 42 AS value)
    // SELECT * FROM player
    // WHERE score = (SELECT * FROM answer)
    let answer = CommonTableExpression(
        named: "answer",
        sql: "SELECT 42 AS value")
    let players = try Player
        .filter(Column("score") == answer.all())
        .with(answer)
        .fetchAll(db)
    
  • An SQL expression that checks the inclusion of an expression in a common table expression.

    let playerNameCTE = CommonTableExpression(
        named: "playerName",
        request: Player.select(Column("name"))
    
    // name IN playerName
    playerNameCTE.contains(Column("name"))
    
  • Creates an association to a common table expression that you can join or include in another request.

    The key of the returned association is the table name of the common table expression.

  • Creates an association to a common table expression that you can join or include in another request.

    The key of the returned association is the table name of the common table expression.