HeliosDB SQL Function Reference
HeliosDB SQL Function Reference
Version: 7.0 (PostgreSQL 17 Compatible) Last Updated: January 2026
Complete reference for all SQL functions available in HeliosDB, including aggregate, string, date/time, JSON/JSONB, vector, window, and analytical functions.
Table of Contents
- Aggregate Functions
- String Functions
- Date/Time Functions
- Mathematical Functions
- JSON/JSONB Functions
- Array Functions
- Vector Functions
- Window Functions
- Analytical Functions
- Conditional Functions
- Type Conversion Functions
- System Functions
Aggregate Functions
Aggregate functions compute a single result from a set of input values.
COUNT
Count rows or non-null values.
-- Count all rowsSELECT COUNT(*) FROM users;
-- Count non-null valuesSELECT COUNT(email) FROM users;
-- Count distinct valuesSELECT COUNT(DISTINCT status) FROM users;
-- Count with filterSELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count FROM users;SUM
Calculate the sum of numeric values.
-- Basic sumSELECT SUM(amount) FROM orders;
-- Sum with groupingSELECT customer_id, SUM(amount) AS total_spentFROM ordersGROUP BY customer_id;
-- Sum with filterSELECT SUM(amount) FILTER (WHERE status = 'completed') AS completed_totalFROM orders;
-- Sum distinct valuesSELECT SUM(DISTINCT amount) FROM orders;AVG
Calculate the average of numeric values.
-- Basic averageSELECT AVG(age) FROM users;
-- Average with precisionSELECT ROUND(AVG(salary)::numeric, 2) AS avg_salary FROM employees;
-- Weighted averageSELECT SUM(price * quantity) / SUM(quantity) AS weighted_avg_priceFROM order_items;
-- Moving average (with window function)SELECT date, value, AVG(value) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg_7dFROM daily_metrics;MIN / MAX
Find minimum and maximum values.
-- Basic min/maxSELECT MIN(created_at), MAX(created_at) FROM users;
-- Min/max with groupingSELECT category, MIN(price) AS min_price, MAX(price) AS max_priceFROM productsGROUP BY category;
-- Min/max on text (alphabetical)SELECT MIN(name), MAX(name) FROM users;
-- Min/max on datesSELECT MIN(order_date) AS first_order, MAX(order_date) AS last_orderFROM ordersWHERE customer_id = 123;STRING_AGG
Concatenate strings with a delimiter.
-- Basic string aggregationSELECT STRING_AGG(name, ', ') FROM users;
-- With orderingSELECT STRING_AGG(name, ', ' ORDER BY name) AS sorted_names FROM users;
-- With distinctSELECT STRING_AGG(DISTINCT category, ', ') AS categories FROM products;
-- Grouped string aggregationSELECT department_id, STRING_AGG(employee_name, ', ') AS employeesFROM employeesGROUP BY department_id;ARRAY_AGG
Aggregate values into an array.
-- Basic array aggregationSELECT ARRAY_AGG(id) FROM users WHERE status = 'active';
-- With orderingSELECT ARRAY_AGG(name ORDER BY created_at DESC) FROM users;
-- Grouped array aggregationSELECT category, ARRAY_AGG(product_name) AS productsFROM productsGROUP BY category;
-- Multidimensional arraySELECT ARRAY_AGG(ARRAY[id, age]) FROM users;JSON_AGG / JSONB_AGG
Aggregate values into a JSON array.
-- Basic JSON aggregationSELECT JSON_AGG(name) FROM users;
-- Aggregate rows as JSON objectsSELECT JSON_AGG(row_to_json(u)) FROM users u WHERE status = 'active';
-- With orderingSELECT JSONB_AGG(name ORDER BY created_at) FROM users;
-- Grouped JSON aggregationSELECT category, JSONB_AGG(jsonb_build_object( 'id', id, 'name', name, 'price', price)) AS productsFROM productsGROUP BY category;JSON_OBJECT_AGG / JSONB_OBJECT_AGG
Aggregate key-value pairs into a JSON object.
-- Create object from key-value pairsSELECT JSON_OBJECT_AGG(key, value) FROM settings;
-- Create object with custom keysSELECT JSONB_OBJECT_AGG(id::text, name) AS id_to_name_map FROM users;
-- Grouped object aggregationSELECT department_id, JSONB_OBJECT_AGG(employee_id::text, employee_name) AS employeesFROM employeesGROUP BY department_id;BOOL_AND / BOOL_OR
Aggregate boolean values.
-- All true checkSELECT BOOL_AND(is_verified) AS all_verified FROM users;
-- Any true checkSELECT BOOL_OR(has_premium) AS any_premium FROM users;
-- With groupingSELECT department_id, BOOL_AND(completed) AS all_completedFROM tasksGROUP BY department_id;PERCENTILE_CONT / PERCENTILE_DISC
Calculate percentiles.
-- Continuous percentile (interpolated)SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salaryFROM employees;
-- Multiple percentilesSELECT PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY response_time) AS p25, PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY response_time) AS p50, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY response_time) AS p75, PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY response_time) AS p95, PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY response_time) AS p99FROM requests;
-- Discrete percentile (actual value)SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY score) AS median_scoreFROM exam_results;Statistical Functions
-- Standard deviationSELECT STDDEV(salary), STDDEV_POP(salary), STDDEV_SAMP(salary)FROM employees;
-- VarianceSELECT VARIANCE(salary), VAR_POP(salary), VAR_SAMP(salary)FROM employees;
-- Correlation coefficientSELECT CORR(advertising_spend, sales) AS correlationFROM monthly_data;
-- CovarianceSELECT COVAR_POP(x, y), COVAR_SAMP(x, y)FROM data_points;
-- RegressionSELECT REGR_SLOPE(sales, advertising) AS slope, REGR_INTERCEPT(sales, advertising) AS intercept, REGR_R2(sales, advertising) AS r_squaredFROM monthly_data;String Functions
Functions for manipulating text and string data.
CONCAT / CONCAT_WS
Concatenate strings.
-- Basic concatenationSELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- Concatenate with separatorSELECT CONCAT_WS(', ', city, state, country) AS location FROM addresses;
-- Handles NULL gracefullySELECT CONCAT(name, ' - ', COALESCE(description, 'No description')) FROM products;SUBSTRING / SUBSTR
Extract a portion of a string.
-- Extract by position and lengthSELECT SUBSTRING(email FROM 1 FOR 10) FROM users;
-- Alternative syntaxSELECT SUBSTR(phone, 1, 3) AS area_code FROM contacts;
-- Extract using patternSELECT SUBSTRING(email FROM '@(.*)$') AS domain FROM users;
-- Extract from position to endSELECT SUBSTRING(text FROM 5) FROM documents;UPPER / LOWER / INITCAP
Change case.
-- Convert to uppercaseSELECT UPPER(name) FROM users;
-- Convert to lowercaseSELECT LOWER(email) FROM users;
-- Capitalize first letter of each wordSELECT INITCAP(title) FROM articles;
-- Case-insensitive comparisonSELECT * FROM users WHERE LOWER(email) = LOWER('User@Example.COM');TRIM / LTRIM / RTRIM
Remove characters from strings.
-- Remove leading/trailing whitespaceSELECT TRIM(name) FROM users;
-- Remove specific charactersSELECT TRIM(BOTH '0' FROM phone) FROM contacts;
-- Remove leading zerosSELECT LTRIM(code, '0') FROM products;
-- Remove trailing spacesSELECT RTRIM(description) FROM products;
-- Remove leading whitespace onlySELECT TRIM(LEADING FROM name) FROM users;LENGTH / CHAR_LENGTH / BIT_LENGTH
Get string length.
-- Character lengthSELECT LENGTH(name), CHAR_LENGTH(name) FROM users;
-- Byte lengthSELECT OCTET_LENGTH(name) FROM users;
-- Bit lengthSELECT BIT_LENGTH(name) FROM users;
-- Unicode character lengthSELECT LENGTH('Hello world') AS len; -- Returns 11POSITION / STRPOS
Find substring position.
-- Find position of substringSELECT POSITION('@' IN email) FROM users;
-- Alternative syntaxSELECT STRPOS(email, '@') FROM users;
-- Returns 0 if not foundSELECT * FROM users WHERE POSITION('@gmail.com' IN email) > 0;REPLACE / TRANSLATE
Replace characters or substrings.
-- Replace substringSELECT REPLACE(phone, '-', '') AS clean_phone FROM contacts;
-- Replace multiple occurrencesSELECT REPLACE(REPLACE(text, '\n', ' '), '\t', ' ') FROM documents;
-- Translate characters (one-to-one mapping)SELECT TRANSLATE('hello', 'el', 'ip') FROM dual; -- Returns 'hippo'
-- Remove charactersSELECT TRANSLATE(phone, '()-. ', '') FROM contacts;SPLIT_PART
Split string and get a specific part.
-- Split by delimiter and get partSELECT SPLIT_PART(email, '@', 1) AS username, SPLIT_PART(email, '@', 2) AS domainFROM users;
-- Split path and get filenameSELECT SPLIT_PART(file_path, '/', -1) AS filename FROM files;
-- Handle multiple delimitersSELECT SPLIT_PART('a,b,c', ',', 2); -- Returns 'b'REGEXP Functions
Regular expression operations.
-- Check if pattern matchesSELECT * FROM users WHERE email ~ '^[a-z]+@gmail\.com$';
-- Case-insensitive matchSELECT * FROM users WHERE name ~* 'john';
-- Replace with regexSELECT REGEXP_REPLACE(phone, '[^0-9]', '', 'g') AS digits_only FROM contacts;
-- Extract matchesSELECT REGEXP_MATCHES(email, '([^@]+)@([^.]+)\.(.+)') FROM users;
-- Split by regexSELECT REGEXP_SPLIT_TO_ARRAY(tags, '[,;|]') FROM articles;
-- Split to tableSELECT REGEXP_SPLIT_TO_TABLE(tags, '[,;|]') AS tag FROM articles;LEFT / RIGHT
Extract characters from left or right.
-- Get first N charactersSELECT LEFT(name, 10) FROM users;
-- Get last N charactersSELECT RIGHT(phone, 4) AS last_four FROM contacts;
-- Negative valuesSELECT LEFT(name, -2); -- All except last 2 charactersLPAD / RPAD
Pad strings to a specific length.
-- Left pad with zerosSELECT LPAD(id::text, 8, '0') AS padded_id FROM orders;
-- Right pad with spacesSELECT RPAD(name, 50, ' ') AS fixed_width FROM users;
-- Pad with custom charactersSELECT LPAD(amount::text, 10, '*') FROM transactions;REPEAT / REVERSE
Repeat or reverse strings.
-- Repeat stringSELECT REPEAT('*', 10); -- '**********'
-- Reverse stringSELECT REVERSE(name) FROM users;
-- Create separator lineSELECT REPEAT('-', 80) AS separator;FORMAT
Format strings using placeholders.
-- Basic formattingSELECT FORMAT('Hello, %s!', name) FROM users;
-- Multiple argumentsSELECT FORMAT('%s (%s) - $%s', product_name, sku, price) FROM products;
-- Numbered placeholders (for reuse)SELECT FORMAT('%1$s, %1$s, %2$s', 'hello', 'world'); -- 'hello, hello, world'
-- Type formattingSELECT FORMAT('%L', name) AS literal_string FROM users; -- Quoted literalSELECT FORMAT('%I', column_name) AS identifier FROM columns; -- Quoted identifierDate/Time Functions
Functions for working with dates, times, and timestamps.
Current Date/Time
-- Current timestamp with timezoneSELECT NOW();SELECT CURRENT_TIMESTAMP;
-- Current dateSELECT CURRENT_DATE;
-- Current timeSELECT CURRENT_TIME;
-- Transaction start timeSELECT TRANSACTION_TIMESTAMP();
-- Statement start timeSELECT STATEMENT_TIMESTAMP();
-- Actual clock timeSELECT CLOCK_TIMESTAMP();EXTRACT / DATE_PART
Extract components from date/time values.
-- Extract yearSELECT EXTRACT(YEAR FROM created_at) FROM orders;
-- Extract multiple componentsSELECT EXTRACT(YEAR FROM created_at) AS year, EXTRACT(MONTH FROM created_at) AS month, EXTRACT(DAY FROM created_at) AS day, EXTRACT(HOUR FROM created_at) AS hour, EXTRACT(MINUTE FROM created_at) AS minute, EXTRACT(SECOND FROM created_at) AS secondFROM events;
-- Alternative syntaxSELECT DATE_PART('year', created_at) FROM orders;
-- Extract day of week (0=Sunday, 6=Saturday)SELECT EXTRACT(DOW FROM created_at) AS day_of_week FROM events;
-- Extract ISO day of week (1=Monday, 7=Sunday)SELECT EXTRACT(ISODOW FROM created_at) AS iso_day_of_week FROM events;
-- Extract week numberSELECT EXTRACT(WEEK FROM created_at) AS week_number FROM events;
-- Extract quarterSELECT EXTRACT(QUARTER FROM created_at) AS quarter FROM orders;
-- Extract epoch (seconds since 1970-01-01)SELECT EXTRACT(EPOCH FROM created_at) FROM events;DATE_TRUNC
Truncate timestamp to specified precision.
-- Truncate to daySELECT DATE_TRUNC('day', created_at) FROM orders;
-- Truncate to monthSELECT DATE_TRUNC('month', created_at) AS month, COUNT(*) AS order_countFROM ordersGROUP BY DATE_TRUNC('month', created_at);
-- Available precision valuesSELECT DATE_TRUNC('year', ts) AS year, DATE_TRUNC('quarter', ts) AS quarter, DATE_TRUNC('month', ts) AS month, DATE_TRUNC('week', ts) AS week, DATE_TRUNC('day', ts) AS day, DATE_TRUNC('hour', ts) AS hour, DATE_TRUNC('minute', ts) AS minute, DATE_TRUNC('second', ts) AS secondFROM (SELECT NOW() AS ts) t;Interval Arithmetic
-- Add intervalSELECT NOW() + INTERVAL '1 day';SELECT NOW() + INTERVAL '2 hours 30 minutes';SELECT NOW() + INTERVAL '1 month';
-- Subtract intervalSELECT NOW() - INTERVAL '7 days';SELECT created_at - INTERVAL '1 year' FROM users;
-- Multiply intervalSELECT INTERVAL '1 hour' * 24 AS one_day;
-- Date differenceSELECT AGE(NOW(), created_at) FROM users;SELECT created_at - '2025-01-01'::date AS days_since FROM orders;TO_CHAR / TO_TIMESTAMP / TO_DATE
Format and parse dates.
-- Format timestamp to stringSELECT TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI:SS') FROM orders;SELECT TO_CHAR(NOW(), 'Day, Month DD, YYYY') AS formatted_date;SELECT TO_CHAR(NOW(), 'IYYY-IW') AS iso_week;
-- Common format patterns-- YYYY: 4-digit year-- MM: 2-digit month-- DD: 2-digit day-- HH24: 24-hour format hour-- MI: minutes-- SS: seconds-- Day: full day name-- Mon: abbreviated month name
-- Parse string to timestampSELECT TO_TIMESTAMP('2025-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS');
-- Parse string to dateSELECT TO_DATE('2025-12-31', 'YYYY-MM-DD');MAKE_DATE / MAKE_TIME / MAKE_TIMESTAMP
Construct date/time values from components.
-- Create date from componentsSELECT MAKE_DATE(2025, 12, 31);
-- Create time from componentsSELECT MAKE_TIME(14, 30, 45.5);
-- Create timestamp from componentsSELECT MAKE_TIMESTAMP(2025, 12, 31, 23, 59, 59.999);
-- Create timestamp with timezoneSELECT MAKE_TIMESTAMPTZ(2025, 12, 31, 23, 59, 59.999, 'America/New_York');AT TIME ZONE
Convert between time zones.
-- Convert to specific timezoneSELECT created_at AT TIME ZONE 'America/New_York' FROM orders;
-- Convert from UTC to localSELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/London' FROM events;
-- Store with timezone awarenessSELECT NOW() AT TIME ZONE 'UTC';Date Series Generation
-- Generate date seriesSELECT generate_series('2025-01-01'::date, '2025-12-31'::date, '1 day'::interval) AS date;
-- Generate month seriesSELECT generate_series('2025-01-01'::date, '2025-12-01'::date, '1 month'::interval) AS month_start;
-- Generate hourly seriesSELECT generate_series( '2025-01-01 00:00:00'::timestamp, '2025-01-01 23:00:00'::timestamp, '1 hour'::interval) AS hour;Mathematical Functions
Functions for numeric calculations.
Basic Math
-- Absolute valueSELECT ABS(-42); -- 42
-- Ceiling and floorSELECT CEIL(4.3); -- 5SELECT FLOOR(4.8); -- 4
-- RoundSELECT ROUND(4.567); -- 5SELECT ROUND(4.567, 2); -- 4.57SELECT ROUND(4.565, 2); -- 4.57 (banker's rounding)
-- TruncateSELECT TRUNC(4.567); -- 4SELECT TRUNC(4.567, 2); -- 4.56
-- SignSELECT SIGN(-5); -- -1SELECT SIGN(0); -- 0SELECT SIGN(5); -- 1Power and Roots
-- PowerSELECT POWER(2, 10); -- 1024SELECT 2 ^ 10; -- 1024
-- Square rootSELECT SQRT(16); -- 4
-- Cube rootSELECT CBRT(27); -- 3
-- Nth rootSELECT POWER(64, 1.0/3); -- ~4 (cube root)
-- ExponentialSELECT EXP(1); -- ~2.718 (e)SELECT EXP(2); -- ~7.389 (e^2)Logarithms
-- Natural logarithmSELECT LN(10); -- ~2.303
-- Base-10 logarithmSELECT LOG(100); -- 2SELECT LOG10(100); -- 2
-- Custom base logarithmSELECT LOG(2, 8); -- 3 (log base 2 of 8)Trigonometric Functions
-- Basic trigSELECT SIN(PI() / 2); -- 1SELECT COS(0); -- 1SELECT TAN(PI() / 4); -- ~1
-- Inverse trigSELECT ASIN(1); -- PI/2SELECT ACOS(0); -- PI/2SELECT ATAN(1); -- PI/4
-- Two-argument arctangentSELECT ATAN2(1, 1); -- PI/4
-- Degrees/radians conversionSELECT DEGREES(PI()); -- 180SELECT RADIANS(180); -- PIModulo and Division
-- ModuloSELECT MOD(17, 5); -- 2SELECT 17 % 5; -- 2
-- Integer divisionSELECT DIV(17, 5); -- 3SELECT 17 / 5; -- 3 (integer division when both operands are integers)SELECT 17.0 / 5; -- 3.4 (floating point division)Random Numbers
-- Random number between 0 and 1SELECT RANDOM();
-- Random integer in rangeSELECT FLOOR(RANDOM() * 100 + 1)::int AS random_1_to_100;
-- Set random seed (for reproducibility)SELECT SETSEED(0.5);SELECT RANDOM(); -- Always returns same value after setseedGreatest and Least
-- Find greatest valueSELECT GREATEST(1, 5, 3, 9, 2); -- 9
-- Find least valueSELECT LEAST(1, 5, 3, 9, 2); -- 1
-- Practical usage: ensure minimum valueSELECT GREATEST(price * 0.9, 10.00) AS discounted_price FROM products;
-- Practical usage: cap maximumSELECT LEAST(salary * 1.1, 200000) AS capped_raise FROM employees;JSON/JSONB Functions
Functions for working with JSON and JSONB data types.
JSON Operators
-- Extract JSON object field as JSONSELECT data->'user'->'name' FROM events;
-- Extract JSON object field as textSELECT data->>'status' FROM events;
-- Extract JSON array elementSELECT data->0 FROM arrays; -- First element as JSONSELECT data->>0 FROM arrays; -- First element as text
-- Extract nested pathSELECT data#>'{user,address,city}' FROM events; -- As JSONSELECT data#>>'{user,address,city}' FROM events; -- As textJSON Path Queries
-- Check if path existsSELECT data ? 'status' FROM events;
-- Check if any key existsSELECT data ?| ARRAY['status', 'error'] FROM events;
-- Check if all keys existSELECT data ?& ARRAY['id', 'name', 'email'] FROM events;
-- ContainmentSELECT data @> '{"status": "active"}' FROM events;SELECT '{"status": "active"}' <@ data FROM events;JSON Construction
-- Build JSON objectSELECT jsonb_build_object( 'id', id, 'name', name, 'email', email, 'created_at', created_at) FROM users;
-- Build JSON arraySELECT jsonb_build_array(1, 2, 3, 'four');
-- Aggregate to JSON objectSELECT jsonb_object_agg(key, value) FROM settings;
-- Convert row to JSONSELECT row_to_json(u) FROM users u;SELECT to_jsonb(u) FROM users u;JSON Modification
-- Set value at pathSELECT jsonb_set(data, '{status}', '"inactive"') FROM events;
-- Set nested valueSELECT jsonb_set(data, '{user,verified}', 'true') FROM events;
-- Insert if key doesn't existSELECT jsonb_set(data, '{new_field}', '"value"', true) FROM events;
-- Delete keySELECT data - 'temporary_field' FROM events;
-- Delete nested keySELECT data #- '{user,password}' FROM events;
-- Delete array elementSELECT data - 0 FROM arrays; -- Remove first element
-- Concatenate/mergeSELECT data || '{"updated_at": "2025-01-04"}' FROM events;JSON Querying
-- Extract all keysSELECT jsonb_object_keys(data) FROM events;
-- Extract all array elementsSELECT jsonb_array_elements(data->'items') FROM events;SELECT jsonb_array_elements_text(data->'tags') FROM events;
-- Expand to recordSELECT * FROM jsonb_each(data) FROM events;SELECT * FROM jsonb_each_text(data) FROM events;
-- Get array lengthSELECT jsonb_array_length(data->'items') FROM events;
-- Get typeSELECT jsonb_typeof(data->'value') FROM events;
-- Pretty printSELECT jsonb_pretty(data) FROM events;
-- Strip nullsSELECT jsonb_strip_nulls(data) FROM events;JSON Path Expression (SQL/JSON)
-- Check if path existsSELECT jsonb_path_exists(data, '$.user.email') FROM events;
-- Query with path expressionSELECT jsonb_path_query(data, '$.items[*].price') FROM events;
-- Query with filterSELECT jsonb_path_query(data, '$.items[*] ? (@.price > 100)') FROM events;
-- Query with variablesSELECT jsonb_path_query(data, '$.items[*] ? (@.price > $min)', '{"min": 50}') FROM events;
-- Query first matchSELECT jsonb_path_query_first(data, '$.items[*].name') FROM events;Array Functions
Functions for working with array data types.
Array Construction
-- Array literalSELECT ARRAY[1, 2, 3, 4, 5];SELECT ARRAY['a', 'b', 'c'];
-- Array from querySELECT ARRAY(SELECT id FROM users WHERE status = 'active');
-- Generate series to arraySELECT ARRAY(SELECT generate_series(1, 10));Array Access
-- Get element (1-indexed)SELECT arr[1] FROM (SELECT ARRAY[10, 20, 30] AS arr) t;
-- Get sliceSELECT arr[2:4] FROM (SELECT ARRAY[10, 20, 30, 40, 50] AS arr) t;
-- Array lengthSELECT array_length(ARRAY[1, 2, 3], 1); -- 3SELECT cardinality(ARRAY[1, 2, 3]); -- 3Array Operations
-- Concatenate arraysSELECT ARRAY[1, 2] || ARRAY[3, 4]; -- {1,2,3,4}
-- Append elementSELECT ARRAY[1, 2, 3] || 4; -- {1,2,3,4}
-- Prepend elementSELECT 0 || ARRAY[1, 2, 3]; -- {0,1,2,3}
-- Check containmentSELECT ARRAY[1, 2, 3] @> ARRAY[2, 3]; -- trueSELECT ARRAY[2, 3] <@ ARRAY[1, 2, 3]; -- true
-- Check overlapSELECT ARRAY[1, 2, 3] && ARRAY[3, 4, 5]; -- true (both contain 3)
-- Check membershipSELECT 2 = ANY(ARRAY[1, 2, 3]); -- trueSELECT 5 = ALL(ARRAY[5, 5, 5]); -- trueArray Functions
-- Expand array to rowsSELECT unnest(ARRAY[1, 2, 3]) AS value;
-- Array positionSELECT array_position(ARRAY['a', 'b', 'c'], 'b'); -- 2
-- Array positions (all occurrences)SELECT array_positions(ARRAY[1, 2, 1, 3, 1], 1); -- {1,3,5}
-- Remove elementSELECT array_remove(ARRAY[1, 2, 3, 2], 2); -- {1,3}
-- Replace elementSELECT array_replace(ARRAY[1, 2, 3, 2], 2, 9); -- {1,9,3,9}
-- Array to stringSELECT array_to_string(ARRAY[1, 2, 3], ', '); -- '1, 2, 3'
-- String to arraySELECT string_to_array('1,2,3', ','); -- {1,2,3}
-- Array dimensionsSELECT array_dims(ARRAY[[1,2],[3,4]]); -- '[1:2][1:2]'Vector Functions
HeliosDB-specific functions for vector similarity search and operations.
Vector Distance Operators
-- Cosine distance (0 = identical, 2 = opposite)SELECT embedding <=> query_embedding FROM documents;
-- Euclidean distance (L2)SELECT embedding <-> query_embedding FROM documents;
-- Inner product (negative, for similarity ranking)SELECT embedding <#> query_embedding FROM documents;Vector Similarity Search
-- Find most similar documents (cosine)SELECT id, title, embedding <=> '[0.1, 0.2, 0.3, ...]'::vector AS distanceFROM documentsORDER BY embedding <=> '[0.1, 0.2, 0.3, ...]'::vectorLIMIT 10;
-- Find nearest neighbors (L2)SELECT id, titleFROM documentsORDER BY embedding <-> '[0.1, 0.2, 0.3, ...]'::vectorLIMIT 10;
-- Hybrid search with filtersSELECT id, title, embedding <=> query_vec AS distanceFROM documentsWHERE category = 'technology' AND published = trueORDER BY embedding <=> query_vecLIMIT 10;Vector Functions
-- Get vector dimensionsSELECT vector_dims(embedding) FROM documents LIMIT 1;
-- Get vector norm (magnitude)SELECT vector_norm(embedding) FROM documents;
-- Normalize vector to unit lengthSELECT vector_normalize(embedding) FROM documents;
-- Average of vectorsSELECT AVG(embedding) FROM documents WHERE category = 'science';
-- Sum of vectorsSELECT SUM(embedding) FROM documents WHERE topic = 'AI';
-- Cosine similarity (1 - cosine_distance)SELECT 1 - (embedding <=> query_vec) AS similarityFROM documents;Vector Index Hints
-- Set search parameter for HNSWSET hnsw.ef_search = 100;
-- Query with hintSELECT /*+ HNSW_EF_SEARCH(200) */ id, titleFROM documentsORDER BY embedding <=> query_vecLIMIT 10;Window Functions
Functions that operate over a window of rows.
Ranking Functions
-- Row number (unique sequential)SELECT id, name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS rankFROM leaderboard;
-- Rank (same rank for ties, gaps after)SELECT id, name, score, RANK() OVER (ORDER BY score DESC) AS rankFROM leaderboard;
-- Dense rank (same rank for ties, no gaps)SELECT id, name, score, DENSE_RANK() OVER (ORDER BY score DESC) AS rankFROM leaderboard;
-- Percent rank (relative rank as percentage)SELECT id, name, score, PERCENT_RANK() OVER (ORDER BY score DESC) AS pct_rankFROM leaderboard;
-- Ntile (divide into N buckets)SELECT id, name, score, NTILE(4) OVER (ORDER BY score DESC) AS quartileFROM leaderboard;PARTITION BY
-- Rank within groupsSELECT department, employee_name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rankFROM employees;
-- Running total per groupSELECT customer_id, order_date, amount, SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS running_totalFROM orders;LAG / LEAD
Access values from other rows.
-- Previous row valueSELECT date, value, LAG(value) OVER (ORDER BY date) AS prev_value, value - LAG(value) OVER (ORDER BY date) AS changeFROM daily_metrics;
-- Next row valueSELECT date, value, LEAD(value) OVER (ORDER BY date) AS next_valueFROM daily_metrics;
-- Offset and defaultSELECT date, value, LAG(value, 7, 0) OVER (ORDER BY date) AS value_7_days_agoFROM daily_metrics;FIRST_VALUE / LAST_VALUE / NTH_VALUE
-- First value in windowSELECT date, value, FIRST_VALUE(value) OVER (ORDER BY date) AS first_valueFROM daily_metrics;
-- Last value in window (requires frame specification)SELECT date, value, LAST_VALUE(value) OVER ( ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS last_valueFROM daily_metrics;
-- Nth valueSELECT date, value, NTH_VALUE(value, 3) OVER (ORDER BY date) AS third_valueFROM daily_metrics;Frame Specifications
-- Running sumSELECT date, amount, SUM(amount) OVER (ORDER BY date) AS running_sumFROM transactions;
-- Moving average (7-day window)SELECT date, value, AVG(value) OVER ( ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS moving_avg_7FROM daily_metrics;
-- Centered moving averageSELECT date, value, AVG(value) OVER ( ORDER BY date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING ) AS centered_avgFROM daily_metrics;
-- Range-based window (all rows within 7 days)SELECT date, value, AVG(value) OVER ( ORDER BY date RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW ) AS rolling_7_day_avgFROM daily_metrics;Named Windows
-- Define reusable windowSELECT date, value, SUM(value) OVER w AS running_sum, AVG(value) OVER w AS running_avg, MIN(value) OVER w AS running_min, MAX(value) OVER w AS running_maxFROM daily_metricsWINDOW w AS (ORDER BY date);Analytical Functions
Advanced analytical and statistical functions.
CUME_DIST
Cumulative distribution.
-- Cumulative distribution (fraction of rows with value <= current)SELECT name, score, CUME_DIST() OVER (ORDER BY score) AS cumulative_distFROM exam_results;GROUPING SETS / CUBE / ROLLUP
Multi-level aggregations.
-- Grouping sets (specific grouping combinations)SELECT category, subcategory, SUM(sales)FROM productsGROUP BY GROUPING SETS ( (category, subcategory), (category), ());
-- Rollup (hierarchical groupings)SELECT year, quarter, month, SUM(revenue)FROM salesGROUP BY ROLLUP(year, quarter, month);
-- Cube (all possible grouping combinations)SELECT region, product, channel, SUM(sales)FROM ordersGROUP BY CUBE(region, product, channel);
-- Identify grouping levelSELECT CASE WHEN GROUPING(category) = 1 THEN 'Total' ELSE category END AS category, SUM(sales)FROM productsGROUP BY ROLLUP(category);Time-Series Analysis
-- Year-over-year comparisonSELECT DATE_TRUNC('month', date) AS month, SUM(revenue) AS revenue, LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', date)) AS revenue_ly, ROUND(100.0 * (SUM(revenue) - LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', date))) / NULLIF(LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', date)), 0), 2) AS yoy_pctFROM daily_salesGROUP BY DATE_TRUNC('month', date);
-- Moving average with trendWITH monthly_data AS ( SELECT DATE_TRUNC('month', date) AS month, SUM(value) AS total FROM metrics GROUP BY DATE_TRUNC('month', date))SELECT month, total, AVG(total) OVER (ORDER BY month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS ma_3m, AVG(total) OVER (ORDER BY month ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS ma_12mFROM monthly_data;Mode
Find the most frequent value.
-- Mode (most frequent value)SELECT MODE() WITHIN GROUP (ORDER BY category) AS most_common_categoryFROM products;Conditional Functions
Functions for conditional logic.
CASE
-- Simple CASESELECT name, CASE status WHEN 'active' THEN 'Active' WHEN 'inactive' THEN 'Inactive' WHEN 'pending' THEN 'Pending' ELSE 'Unknown' END AS status_labelFROM users;
-- Searched CASESELECT name, age, CASE WHEN age < 18 THEN 'Minor' WHEN age BETWEEN 18 AND 64 THEN 'Adult' ELSE 'Senior' END AS age_groupFROM users;
-- CASE in aggregationSELECT COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count, COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_countFROM users;COALESCE
Return first non-null value.
-- Default value for nullSELECT COALESCE(nickname, first_name, 'Unknown') AS display_name FROM users;
-- Null handling in calculationsSELECT price * COALESCE(quantity, 1) AS total FROM order_items;NULLIF
Return null if values are equal.
-- Avoid division by zeroSELECT revenue / NULLIF(expenses, 0) AS margin FROM financials;
-- Convert empty string to nullSELECT NULLIF(TRIM(phone), '') AS phone FROM contacts;IIF (HeliosDB Extension)
Inline if-then-else.
-- Simple conditionalSELECT name, IIF(age >= 18, 'Adult', 'Minor') AS age_category FROM users;Type Conversion Functions
Functions for converting between data types.
CAST
-- Standard CAST syntaxSELECT CAST(price AS INTEGER) FROM products;SELECT CAST('2025-01-04' AS DATE);SELECT CAST(123 AS VARCHAR);
-- PostgreSQL shorthandSELECT price::INTEGER FROM products;SELECT '2025-01-04'::DATE;SELECT 123::TEXT;Specific Conversion Functions
-- To integerSELECT TO_NUMBER('12345', '99999');
-- To text with formattingSELECT TO_CHAR(1234567.89, 'FM$9,999,999.00'); -- '$1,234,567.89'SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS');
-- To timestampSELECT TO_TIMESTAMP('2025-01-04 12:30:00', 'YYYY-MM-DD HH24:MI:SS');
-- To dateSELECT TO_DATE('2025-01-04', 'YYYY-MM-DD');System Functions
Functions for system information and administration.
Current User and Session
-- Current userSELECT CURRENT_USER;SELECT SESSION_USER;
-- Current databaseSELECT CURRENT_DATABASE();SELECT CURRENT_CATALOG;
-- Current schemaSELECT CURRENT_SCHEMA;SELECT CURRENT_SCHEMAS(true); -- Include implicit schemas
-- Transaction IDSELECT txid_current();
-- Process IDSELECT pg_backend_pid();Object Information
-- Table sizeSELECT pg_size_pretty(pg_total_relation_size('users'));SELECT pg_size_pretty(pg_table_size('users'));SELECT pg_size_pretty(pg_indexes_size('users'));
-- Column typeSELECT pg_typeof(column_name) FROM table_name LIMIT 1;
-- Check if table existsSELECT EXISTS ( SELECT FROM information_schema.tables WHERE table_name = 'users');UUID Generation
-- Generate UUID v4SELECT gen_random_uuid();
-- UUID from stringSELECT 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid;Hashing
-- MD5 hashSELECT MD5('hello world');
-- SHA-256 hashSELECT encode(sha256('hello world'::bytea), 'hex');
-- Password hashingSELECT crypt('password', gen_salt('bf'));See Also
- DDL Reference - Data Definition Language statements
- HTTP REST API - REST API reference
- SQL API Reference - Complete SQL reference
Last Updated: January 2026 HeliosDB Version: 7.0.0