In SQL Server a user-defined function (UDF) can return a table (a table-valued function), so you can refer to the function in FROM clause.
MySQL does not support table-valued functions but you can use JSON arrays and JSON functions to implement them.
SQL Server:
-- A table-valued function CREATE FUNCTION getColors() RETURNS TABLE AS RETURN ( SELECT 'Red' AS name, 'R' AS category UNION ALL SELECT 'Blue' AS name, 'B' AS category UNION ALL SELECT 'Green' AS name, 'G' AS category ) GO -- Use the function in FROM SELECT * FROM getColors()
Result:
name | category |
Red | R |
Blue | B |
Green | G |
In MySQL you can use JSON_ARRAYAGG and JSON_OBJECT functions to create a JSON array returned by a function:
MySQL:
DELIMITER // -- Emulate table-valued function by returning JSON array CREATE FUNCTION getColors() RETURNS LONGTEXT DETERMINISTIC BEGIN DECLARE data LONGTEXT; SELECT JSON_ARRAYAGG(JSON_OBJECT('name', name, 'category', category)) INTO data FROM ( SELECT 'Red' AS name, 'R' AS category UNION ALL SELECT 'Blue' AS name, 'B' AS category UNION ALL SELECT 'Green' AS name, 'G' AS category ) data; RETURN data; END // DELIMITER ;
Now you can invoke this function using JSON_TABLE function as follows:
MySQL:
-- Using JSON_TABLE function to convert JSON array back to rows SELECT * FROM JSON_TABLE(getColors(), '$[*]' COLUMNS(name VARCHAR(30) PATH '$.name', category VARCHAR(30) PATH '$.category')) t;
Result:
name | category |
Red | R |
Blue | B |
Green | G |
For more information, see SQL Server to MySQL Migration.