zoobzio December 12, 2025 Edit this page

Operators Reference

Complete list of operators available in ASTQL.

Comparison Operators

Basic comparison operators for WHERE conditions.

ConstantSQLDescriptionExample
EQ=Equals"id" = :id
NE!=Not equals"status" != :status
GT>Greater than"price" > :min
GE>=Greater than or equal"age" >= :min_age
LT<Less than"date" < :cutoff
LE<=Less than or equal"count" <= :max

Usage

instance.C(instance.F("id"), astql.EQ, instance.P("id"))
// "id" = :id

Pattern Matching

String pattern matching operators.

ConstantSQLDescriptionExample
LIKELIKEPattern match (case-sensitive)"name" LIKE :pattern
NotLikeNOT LIKEPattern non-match"name" NOT LIKE :pattern
ILIKEILIKEPattern match (case-insensitive)"name" ILIKE :pattern
NotILikeNOT ILIKEPattern non-match (case-insensitive)"name" NOT ILIKE :pattern

Usage

instance.C(instance.F("email"), astql.ILIKE, instance.P("search"))
// "email" ILIKE :search

// With wildcards in parameter value
params := map[string]any{"search": "%@example.com"}

NULL Operators

Check for NULL values.

ConstantSQLDescriptionExample
IsNullIS NULLValue is NULL"deleted_at" IS NULL
IsNotNullIS NOT NULLValue is not NULL"verified_at" IS NOT NULL

Usage

instance.Null(instance.F("deleted_at"))
// "deleted_at" IS NULL

instance.NotNull(instance.F("email"))
// "email" IS NOT NULL

Array Operators

PostgreSQL array membership operators.

ConstantSQLDescriptionExample
IN= ANY()Value in array"id" = ANY(:ids)
NotIn!= ALL()Value not in array"status" != ALL(:excluded)

Usage

instance.C(instance.F("id"), astql.IN, instance.P("ids"))
// "id" = ANY(:ids)

instance.C(instance.F("status"), astql.NotIn, instance.P("excluded"))
// "status" != ALL(:excluded)

With sqlx

import "github.com/lib/pq"

params := map[string]any{
    "ids": pq.Array([]int{1, 2, 3}),
    "excluded": pq.Array([]string{"draft", "deleted"}),
}

Subquery Operators

Operators for subquery conditions.

ConstantSQLDescription
ININValue in subquery results
NotInNOT INValue not in subquery results
EXISTSEXISTSSubquery returns rows
NotExistsNOT EXISTSSubquery returns no rows

Usage

// IN subquery
subquery := astql.Sub(astql.Select(table).Fields(field))
astql.CSub(instance.F("id"), astql.IN, subquery)
// "id" IN (SELECT "user_id" FROM "orders")

// EXISTS
astql.CSubExists(astql.EXISTS, subquery)
// EXISTS (SELECT "id" FROM "orders" WHERE ...)

Regex Operators

PostgreSQL regular expression operators.

ConstantSQLDescriptionExample
RegexMatch~Regex match (case-sensitive)"code" ~ :pattern
RegexIMatch~*Regex match (case-insensitive)"name" ~* :pattern
NotRegexMatch!~Regex non-match"email" !~ :pattern
NotRegexIMatch!~*Regex non-match (case-insensitive)"name" !~* :pattern

Usage

instance.C(instance.F("code"), astql.RegexMatch, instance.P("pattern"))
// "code" ~ :pattern

params := map[string]any{"pattern": "^[A-Z]{3}-[0-9]+$"}

PostgreSQL Array Operators

Array containment and overlap operators.

ConstantSQLDescriptionExample
ArrayContains@>Array contains"tags" @> :required_tags
ArrayContainedBy<@Array is contained by"permissions" <@ :allowed
ArrayOverlap&&Arrays overlap"categories" && :search_cats

Usage

instance.C(instance.F("tags"), astql.ArrayContains, instance.P("required"))
// "tags" @> :required

params := map[string]any{
    "required": pq.Array([]string{"featured", "published"}),
}

JSONB Field Access (PostgreSQL)

Access JSONB object keys directly in queries. Keys are parameterized for SQL injection safety.

MethodSQLDescriptionExample
JSONBText()->>Extract as text"metadata"->>:key_param
JSONBPath()->Extract as JSON"metadata"->:key_param

Usage

// Text extraction (returns string) - key is parameterized
statusField := instance.JSONBText(instance.F("metadata"), instance.P("status_key"))
// "metadata"->>:status_key

// Path access (returns JSONB, use with array operators)
tagsField := instance.JSONBPath(instance.F("metadata"), instance.P("tags_key"))
// "metadata"->:tags_key

// In WHERE clause
instance.C(statusField, astql.EQ, instance.P("status_value"))
// "metadata"->>:status_key = :status_value

// JSONB array containment
instance.C(tagsField, astql.ArrayContains, instance.P("required_tags"))
// "metadata"->:tags_key @> :required_tags

Both the JSONB key and the comparison value are parameterized, preventing SQL injection.

Vector Operators (pgvector)

Distance operators for vector similarity search.

ConstantSQLDescriptionUse Case
VectorL2Distance<->Euclidean (L2) distanceGeneral similarity
VectorCosineDistance<=>Cosine distanceText embeddings
VectorInnerProduct<#>Negative inner productMaximum similarity
VectorL1Distance<+>Manhattan (L1) distanceSparse vectors

Usage

// In WHERE clause
instance.C(instance.F("embedding"), astql.VectorL2Distance, instance.P("query"))
// "embedding" <-> :query

// In ORDER BY (most common)
query.OrderByExpr(
    instance.F("embedding"),
    astql.VectorCosineDistance,
    instance.P("query_embedding"),
    astql.ASC,
)
// ORDER BY "embedding" <=> :query_embedding ASC

With pgvector

import "github.com/pgvector/pgvector-go"

embedding := pgvector.NewVector([]float32{0.1, 0.2, 0.3, ...})
params := map[string]any{"query_embedding": embedding}

Operator Selection Guide

NeedOperator
Exact matchEQ
Not equalNE
Range checkGT, GE, LT, LE
Pattern searchLIKE, ILIKE
NULL checkIsNull, IsNotNull
List membershipIN, NotIn
Regex matchRegexMatch, RegexIMatch
Array containmentArrayContains, ArrayContainedBy
Vector similarityVectorL2Distance, VectorCosineDistance
Subquery checkEXISTS, NotExists

Aggregate Functions

For use with SelectExpr and aggregate expressions.

ConstantSQLDescription
AggSumSUM()Sum of values
AggAvgAVG()Average of values
AggMinMIN()Minimum value
AggMaxMAX()Maximum value
AggCountFieldCOUNT()Count of values
AggCountDistinctCOUNT(DISTINCT)Count of unique values

Window Functions

For use with window expressions.

ConstantSQLDescription
WinRowNumberROW_NUMBER()Sequential row number
WinRankRANK()Rank with gaps
WinDenseRankDENSE_RANK()Rank without gaps
WinNtileNTILE(:param)Divide into n buckets
WinLagLAG()Previous row value
WinLeadLEAD()Next row value
WinFirstValueFIRST_VALUE()First value in window
WinLastValueLAST_VALUE()Last value in window

Frame Bounds

For window frame specifications.

ConstantSQL
FrameUnboundedPrecedingUNBOUNDED PRECEDING
FrameCurrentRowCURRENT ROW
FrameUnboundedFollowingUNBOUNDED FOLLOWING

Cast Types

For type casting with Cast().

ConstantPostgreSQL Type
CastTextTEXT
CastIntegerINTEGER
CastBigintBIGINT
CastSmallintSMALLINT
CastNumericNUMERIC
CastRealREAL
CastDoublePrecisionDOUBLE PRECISION
CastBooleanBOOLEAN
CastDateDATE
CastTimeTIME
CastTimestampTIMESTAMP
CastTimestampTZTIMESTAMPTZ
CastIntervalINTERVAL
CastUUIDUUID
CastJSONJSON
CastJSONBJSONB
CastByteaBYTEA