web-dev-qa-db-ja.com

MariaDBまたはMySQLはVALUES(式)テーブル値コンストラクタを実装しますか?

MariaDBまたはMySQLがSQL仕様に_<table value constructor>_を実装しているかどうか疑問に思っています。 SQL Server および PostgreSQLでは、これは標準化されたVALUES (expression)

_SELECT *
FROM ( VALUES (1) ) AS t(x);
 x 
---
 1
(1 row)
_

(構文は postgresql から)。

2
Evan Carroll

MariaDB 10.3以降

はい、そうです MariaDB 10.3.3以降では、テーブル値コンストラクタをサポートしているようです。

SELECT 1、t.7 
 FROM(VALUES(7)、(42))AS t; 
 1 | 7 
 -------- 
 1 | 7 
 1 | 42 

FROM句では column_alias がサポートされておらず、代わりにtable_aliasとの名前を最初に使用する必要があることがわかりますその列の行の値。ただし、CTEのWITH句では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)です。

5