cquill/typed/raw
Types
Values
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 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_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_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 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 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 not_in_subquery(
column: table.Column(t, a),
subquery: RawExpr,
) -> RawExpr
NOT IN with a subquery.
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 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 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_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 trim(column: table.Column(t, String)) -> RawExpr
TRIM(column) - Remove leading/trailing whitespace.
pub fn upper(column: table.Column(t, String)) -> RawExpr
UPPER(column) - Uppercase string.