Important
The SingleStore 9.1 release candidate (RC) gives you the opportunity to preview, evaluate, and provide feedback on new and upcoming features prior to their general availability. In the interim, SingleStore 9.0 is recommended for production workloads, which can later be upgraded to SingleStore 9.1.
TABLE
On this page
It is a table-valued function that converts a PSQL array to a set of rows.
Syntax
TABLE( [DISTINCT] array) [WITH ORDINALITY]Arguments
-
array: A PSQL array of scalar values.
Return Type
A set of table-type rows.
Remarks
-
When used without the
WITH ORDINALITYoption, theTABLE()function returns a table with a single column namedtable_, where each row contains a single element from the input array.col -
The
WITH ORDINALITYoption adds an extra column namedtable_of typeord BIGINTto the output that contains the 0-based position of each element in the input array.Refer to Example: Use WITH ORDINALITY Option and Example: Use DISTINCT Option. -
The
TABLE()function can be used only in theFROMclause of a query. -
The array argument to the
TABLE()function must contain only scalar values of valid column data types. -
Array of
RECORDSand multi-dimensional arrays are not supported as arguments to theTABLE()function. -
PSQL arrays are not supported as a table data type or array literals in SingleStore queries.
-
When used as a reference to the second (or subsequent) table in the
FROMclause (with an argument that is correlated), if the array value passed toTABLE()has N entries, the output will have N * number_of_ values_ from_ the_ table_ on_ the_ left rows. The values from the table to the left will be repeated for each array entry. -
The
TABLEfunction supportsDISTINCT.DISTINCTwill de-duplicate the array argument and will generate a table with unique values only.
Examples
Example 1
SELECT * FROM TABLE([1,2,3]);
+------------+
| table_col |
+------------+
| 1 |
| 2 |
| 3 |
+------------+SELECT * FROM TABLE(["hello", "world"]);
+-----------+
| table_col |
+-----------+
| hello |
| world |
+-----------+SELECT * FROM TABLE(JSON_TO_ARRAY('[1,2,3]'));
+------------+
| table_col |
+------------+
| 1 |
| 2 |
| 3 |
+------------+Example 2
In the FROM clause, if the table on the left has 2 rows and the array passed to TABLE() has 2 entries, the output will have 4 rows (2*2).
CREATE TABLE num (x int);INSERT INTO num VALUES (1),(2);
SELECT * FROM num, TABLE([1,2]);
+------+-----------+
| x | table_col |
+------+-----------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
+------+-----------+Example 3
The following example demonstrates the usage of TABLE() function through UDFs.
CREATE TABLE square(num INT PRIMARY KEY);INSERT INTO square VALUES (1),(2),(3),(4),(5);DELIMITER //CREATE OR REPLACE FUNCTION to_array (x INT)RETURNS ARRAY(INT) ASDECLAREarr ARRAY(INT) = CREATE_ARRAY(x+1);BEGINFOR i IN 0..x LOOParr[i] = i * i;END LOOP;RETURN arr;END //DELIMITER ;SELECT num, table_col AS "SQUARE"FROM square INNER JOIN TABLE(to_array(6))ON table_col = num*num ORDER BY num;
+-----+--------+
| num | SQUARE |
+-----+--------+
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
+-----+--------+Example 4
The TABLE function can be used to expand a field in a table.
CREATE TABLE empRole(Name varchar(20), Role JSON);INSERT INTO empRole VALUES('Adam', '["Team Lead","Security Engineer"]'),('Mary','["Product Manager"]');SELECT * FROM empRole;
+-------+-----------------------------------+
| Name | Role |
+-------+-----------------------------------+
| Adam | ["Team Lead","Security Engineer"] |
| Mary | ["Product Manager"] |
+------+------------------------------------+SELECT Name, table_col AS "Title" FROM empRoleJOIN TABLE(JSON_TO_ARRAY(Role));
+------+---------------------+
| Name | Title |
+------+---------------------+
| Adam | "Team Lead" |
| Adam | "Security Engineer" |
| Mary | "Product Manager" |
+------+---------------------+Example 5: Use DISTINCT Option
To return only distinct values from the input array, eliminating duplicates, use the DISTINCT option as:
SELECT * FROM TABLE(DISTINCT [1,1,2,3,2]);
+------------+
| table_col |
+------------+
| 1 |
| 2 |
| 3 |
+------------+SELECT * FROM TABLE(DISTINCT['null', 'primary', 'secondary', 'secondary', 'tertiary', 'null', 'secondary', 'tertiary']) WITH ORDINALITY;
+-----------+-----------+
| table_col | table_ord |
+-----------+-----------+
| null | 0 |
| primary | 1 |
| secondary | 2 |
| tertiary | 3 |
+-----------+-----------+Example 6: Use WITH ORDINALITY Option
The following example shows how to add an ordinality column to the output using the WITH ORDINALITY option.table_ and table_ columns.
SELECT table_col AS Label, table_ord AS PriorityFROM TABLE(["alpha", "beta", "gamma", "delta"]) WITH ORDINALITY;
+-------+----------+
| Label | Priority |
+-------+----------+
| alpha | 0 |
| beta | 1 |
| gamma | 2 |
| delta | 3 |
+-------+----------+You can also use the WITH ORDINALITY option with the TABLE() function in joins.tasks table:
CREATE TABLE tasks (task_id INT PRIMARY KEY,task_name VARCHAR(100) NOT NULL,label VARCHAR(50) NOT NULL);INSERT INTO tasks (task_id, task_name, label) VALUES(1101, 'Task A', 'gamma'),(1102, 'Task B', 'alpha'),(1103, 'Task C', 'beta'),(1104, 'Task D', 'delta');
Use TABLE() WITH ORDINALITY as follows to assign a priority to each label and then order the tasks by priority:
WITH labels AS (SELECT table_col AS Label, table_ord AS PriorityFROM TABLE(["alpha", "beta", "gamma", "delta"]) WITH ORDINALITY)SELECT t.task_name AS Task, l.PriorityFROM tasks t JOIN labels lON t.label = l.LabelORDER BY l.Priority;
+--------+----------+
| Task | Priority |
+--------+----------+
| Task B | 0 |
| Task C | 1 |
| Task A | 2 |
| Task D | 3 |
+--------+----------+Alternatively, you can run this query as:
SELECT t.task_name AS Task, l.table_ord AS PriorityFROM tasks t JOIN TABLE(["alpha", "beta", "gamma", "delta"]) WITH ORDINALITY AS lON t.label = l.table_col ORDER BY l.table_ord;
+--------+----------+
| Task | Priority |
+--------+----------+
| Task B | 0 |
| Task C | 1 |
| Task A | 2 |
| Task D | 3 |
+--------+----------+Last modified: February 11, 2026