cquill/typed/raw

Types

A raw SQL expression with optional parameters.

WARNING: Raw SQL bypasses compile-time type checking. Ensure your SQL is valid and properly parameterized.

Example

raw("NOW()")
raw_with_params("created_at > $1", [StringValue("2024-01-01")])
pub opaque type RawExpr

Values

pub fn add(left: RawExpr, right: RawExpr) -> RawExpr

Add two raw expressions.

pub fn age_from_now(column: table.Column(t, a)) -> RawExpr

AGE - Calculate age between timestamps.

Example

age_from_now(birth_date)  // AGE(birth_date)
pub fn and_raw(conditions: List(RawExpr)) -> RawExpr

AND multiple raw conditions.

pub fn avg(column: table.Column(t, a)) -> RawExpr

AVG(column) - Average values in a column.

pub fn case_when(
  conditions: List(#(RawExpr, RawExpr)),
  else_expr: RawExpr,
) -> RawExpr

Generate a CASE expression.

Example

case_when([
  #(raw("status = 'active'"), raw("'Active'")),
  #(raw("status = 'pending'"), raw("'Pending'")),
], raw("'Unknown'"))
pub fn cast(expr: RawExpr, to_type: String) -> RawExpr

CAST - Cast an expression to a different type.

Example

cast(raw("'123'"), "INTEGER")  // CAST('123' AS INTEGER)
cast(raw("created_at"), "DATE")  // CAST(created_at AS DATE)
pub fn cast_column(
  column: table.Column(t, a),
  to_type: String,
) -> RawExpr

CAST a column to a different type.

pub fn coalesce_column(
  column: table.Column(t, option.Option(String)),
  default: String,
) -> RawExpr

COALESCE - Return first non-null value. Uses column name for type safety reference.

Example

coalesce_column(user_nickname, "Anonymous")
// COALESCE(nickname, 'Anonymous')
pub fn coalesce_int_column(
  column: table.Column(t, option.Option(Int)),
  default: Int,
) -> RawExpr

COALESCE for integer columns.

pub fn coalesce_raw(expressions: List(RawExpr)) -> RawExpr

COALESCE with raw expressions.

Example

coalesce_raw([raw("nickname"), raw("'Anonymous'")])
pub fn column_expr(column: table.Column(t, a)) -> RawExpr

Create a raw expression from a column name.

pub fn column_raw_between(
  column: table.Column(t, a),
  low: RawExpr,
  high: RawExpr,
) -> RawExpr

Column between two raw expressions.

pub fn column_raw_eq(
  column: table.Column(t, a),
  expr: RawExpr,
) -> RawExpr

Create a raw comparison between a column and a raw expression.

Example

column_raw_eq(created_at, now())
// created_at = NOW()
pub fn column_raw_gt(
  column: table.Column(t, a),
  expr: RawExpr,
) -> RawExpr

Column greater than raw expression.

pub fn column_raw_gte(
  column: table.Column(t, a),
  expr: RawExpr,
) -> RawExpr

Column greater than or equal to raw expression.

pub fn column_raw_lt(
  column: table.Column(t, a),
  expr: RawExpr,
) -> RawExpr

Column less than raw expression.

pub fn column_raw_lte(
  column: table.Column(t, a),
  expr: RawExpr,
) -> RawExpr

Column less than or equal to raw expression.

pub fn concat(expressions: List(RawExpr)) -> RawExpr

CONCAT - Concatenate multiple expressions.

Example

concat([raw("first_name"), raw("' '"), raw("last_name")])
pub fn concat_columns_with_separator(
  columns: List(table.Column(t, String)),
  separator: String,
) -> RawExpr

Concatenate columns with a separator.

Example

concat_columns_with_separator([first_name, last_name], " ")
// first_name || ' ' || last_name
pub fn count_all() -> RawExpr

COUNT(*) - Count all rows.

pub fn count_column(column: table.Column(t, a)) -> RawExpr

COUNT(column) - Count non-null values in a column.

pub fn count_distinct(column: table.Column(t, a)) -> RawExpr

COUNT(DISTINCT column) - Count distinct non-null values.

pub fn count_over() -> RawExpr

COUNT(*) OVER () - Window function for total count. Useful for pagination to get total count alongside results.

Example

select_raw(query, [count_over_with_alias("total_count")])
pub fn count_over_with_alias(alias: String) -> RawExpr

COUNT(*) OVER () with an alias.

pub fn current_date() -> RawExpr

CURRENT_DATE - Current date without time

pub fn current_time() -> RawExpr

CURRENT_TIME - Current time without date

pub fn current_timestamp() -> RawExpr

CURRENT_TIMESTAMP - Current timestamp (alternative to NOW())

pub fn date_trunc(
  precision: String,
  column: table.Column(t, a),
) -> RawExpr

DATE_TRUNC - Truncate timestamp to specified precision.

Example

date_trunc("month", created_at)  // DATE_TRUNC('month', created_at)
pub fn divide(left: RawExpr, right: RawExpr) -> RawExpr

Divide left by right.

pub fn exists(subquery: RawExpr) -> RawExpr

EXISTS subquery check.

Example

exists(raw("SELECT 1 FROM orders WHERE orders.user_id = users.id"))
pub fn extract(
  field: String,
  column: table.Column(t, a),
) -> RawExpr

EXTRACT(field FROM column) - Extract part of a timestamp.

Example

extract("year", created_at)   // EXTRACT(year FROM created_at)
extract("month", created_at)  // EXTRACT(month FROM created_at)
pub fn false_literal() -> RawExpr

Create a raw expression for boolean FALSE.

pub fn float_literal(value: Float) -> RawExpr

Create a raw expression from a literal float.

pub fn in_subquery(
  column: table.Column(t, a),
  subquery: RawExpr,
) -> RawExpr

IN with a subquery.

Example

in_subquery(user_id, raw("SELECT id FROM active_users"))
pub fn int_literal(value: Int) -> RawExpr

Create a raw expression from a literal integer.

pub fn interval(amount: Int, unit: String) -> RawExpr

Generate an INTERVAL expression.

Example

interval(7, "days")   // INTERVAL '7 days'
interval(1, "hour")   // INTERVAL '1 hour'
interval(30, "minutes")  // INTERVAL '30 minutes'
pub fn length(column: table.Column(t, String)) -> RawExpr

LENGTH(column) - String length.

pub fn lower(column: table.Column(t, String)) -> RawExpr

LOWER(column) - Lowercase string.

pub fn max(column: table.Column(t, a)) -> RawExpr

MAX(column) - Maximum value in a column.

pub fn min(column: table.Column(t, a)) -> RawExpr

MIN(column) - Minimum value in a column.

pub fn modulo(left: RawExpr, right: RawExpr) -> RawExpr

Modulo operation.

pub fn multiply(left: RawExpr, right: RawExpr) -> RawExpr

Multiply two expressions.

pub fn not_exists(subquery: RawExpr) -> RawExpr

NOT EXISTS subquery check.

pub fn not_in_subquery(
  column: table.Column(t, a),
  subquery: RawExpr,
) -> RawExpr

NOT IN with a subquery.

pub fn not_raw(condition: RawExpr) -> RawExpr

NOT a raw condition.

pub fn now() -> RawExpr

NOW() - Current timestamp

Example

select_raw(query, [now()])
where_raw(query, raw_with_params("created_at > $1 - $2", [
  now_as_value(),
  interval(7, "days"),
]))
pub fn null_literal() -> RawExpr

Create a raw expression for NULL.

pub fn nullif_column(
  column: table.Column(t, String),
  value: String,
) -> RawExpr

NULLIF - Return NULL if two expressions are equal.

Example

nullif_column(status, "deleted")
// NULLIF(status, 'deleted')
pub fn or_raw(conditions: List(RawExpr)) -> RawExpr

OR multiple raw conditions.

pub fn random() -> RawExpr

RANDOM() - Generate a random value (useful for random ordering).

Example

order_by_raw(query, random(), Asc)  // Random order
pub fn raw(sql: String) -> RawExpr

Create a raw SQL expression without parameters.

WARNING: This bypasses type safety. Use for database functions and expressions that don’t accept user input.

Example

raw("NOW()")
raw("RANDOM()")
pub fn raw_params(expr: RawExpr) -> List(ast.Value)

Extract the parameters from a RawExpr.

pub fn raw_sql(expr: RawExpr) -> String

Extract the SQL string from a RawExpr.

pub fn raw_to_condition(expr: RawExpr) -> ast.Condition

Convert a RawExpr to an AST Condition for use in WHERE clauses.

pub fn raw_to_order_by(
  expr: RawExpr,
  direction: ast.Direction,
) -> ast.OrderBy

Convert a RawExpr to an AST OrderBy for use in ORDER BY clauses.

pub fn raw_to_select_expr(
  expr: RawExpr,
  alias: option.Option(String),
) -> ast.SelectExpression

Convert a RawExpr to an AST SelectExpression for use in SELECT clauses.

pub fn raw_with_params(
  sql: String,
  params: List(ast.Value),
) -> RawExpr

Create a raw SQL expression with parameters. Always prefer this over string concatenation to prevent SQL injection.

Example

raw_with_params("email = $1", [StringValue(user_input)])
raw_with_params("created_at > $1 AND status = $2", [
  StringValue("2024-01-01"),
  StringValue("active"),
])
pub fn row_number_over(
  column: table.Column(t, a),
  direction: ast.Direction,
) -> RawExpr

ROW_NUMBER() OVER (ORDER BY column).

pub fn string_literal(value: String) -> RawExpr

Create a raw expression from a literal string. The string is properly escaped and quoted.

pub fn subtract(left: RawExpr, right: RawExpr) -> RawExpr

Subtract right from left.

pub fn sum(column: table.Column(t, a)) -> RawExpr

SUM(column) - Sum values in a column.

pub fn trim(column: table.Column(t, String)) -> RawExpr

TRIM(column) - Remove leading/trailing whitespace.

pub fn true_literal() -> RawExpr

Create a raw expression for boolean TRUE.

pub fn upper(column: table.Column(t, String)) -> RawExpr

UPPER(column) - Uppercase string.

Search Document