Mysql
MariaDB 或 MySQL 是否實現了 VALUES(表達式)表值建構子?
我只是想知道 MariaDB 或 MySQL 是否
<table value constructor>
在 SQL Spec 中實現了。在SQL Server和PostgreSQL 中,這是通過標準化的VALUES (expression)
?SELECT * FROM ( VALUES (1) ) AS t(x); x --- 1 (1 row)
(來自postgresql的語法)。
MariaDB 10.3+
是的,說到MariaDB 10.3.3 及更高版本,它似乎支持表值建構子。
選擇 1, t.7 從(值(7),(42))作為t; 1 | 7 -------- 1 | 7 1 | 42
您會注意到子句中不支持column_alias,
FROM
而是要求您使用 table_alias 和該列的第一行值的名稱。WITH
但是在 CTE 的子句中允許使用 column_alias ,WITH t(a) AS ( VALUES (1),(2) ) SELECT t.a, t.a AS b FROM t; a | b -------- 1 | 1 2 | 2
此外,您可以通過給第一行一個明確的別名來繞過這個。
SELECT 1 AS x ,2 AS y UNION VALUES (3,4),(5,6); x | y ------- 1 | 2 3 | 4 5 | 6
另請參閱https://jira.mariadb.org/browse/MDEV-12172中的範例
PostgreSQL 允許在 FROM 子句中使用列別名,如上所示,
t(x)
MariaDB 也不支持此語法MariaDB <10.3; MySQL 5.x 和 8.x(解決方法)
在 MariaDB 10.3 之前,所有版本的 MySQL 都不支持
VALUES
表達式。SELECT * FROM ( VALUES (1) ) AS t(x); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALUES (1) ) AS t(x)' at line 1
但是,它確實支持帶有文字的子選擇。
SELECT * FROM (SELECT (1) AS x) AS t; -- more simply -- SELECT * FROM (SELECT 1 AS x) AS t; +---+ | x | +---+ | 1 | +---+ 1 row in set (0.00 sec)
PostgreSQL 也支持這種語法。
SELECT * FROM ( SELECT 1 AS x ) AS t; x --- 1 (1 row)
但是,如果您正在執行多行,則使用此語法會變得更加冗長。下面來自 MariaDB,也適用於 PostgreSQL
SELECT * FROM ( SELECT 1 AS x UNION ALL SELECT 2 ) AS t; +---+ | x | +---+ | 1 | | 2 | +---+
而有了
VALUES
,這很簡單VALUES (1),(2)