Mysql

MariaDB 或 MySQL 是否實現了 VALUES(表達式)表值建構子?

  • January 21, 2019

我只是想知道 MariaDB 或 MySQL 是否<table value constructor>在 SQL Spec 中實現了。在SQL ServerPostgreSQL 中,這是通過標準化的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_aliasFROM而是要求您使用 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)

引用自:https://dba.stackexchange.com/questions/177312