SQLのVALUES文の代替方法
最近のRDBMSにはVALUES文が用意されている。MySQLでは8.0.19から導入されており,MariaDBは10.3.3から用意されている (参考: Table Value Constructors – MariaDB Knowledge Base)。
VALUES文を使うことで,リテラルのテーブルを作成できる。なお,MySQLの例ではROW関数が使われているが,これはなくても同じことなので問題ない。
SELECT 1 AS A, 2 AS B FROM (VALUES (1,2), (3,4)) AS temp;
a b 1 2 3 4
しかし,VALUES文は比較的新しい機能であり,MySQL 5.7などでは使うことができない。
今回,MySQL 8.0用にVALUES文を使ったコードを,MySQL 5.7でも動作させる必要に迫られた。そこで,VALUES文を他の標準SQLで代替する方法を調査したので記す。
「mysql – Can you define “literal” tables in SQL? – Stack Overflow」にそのものずばりの質問と回答があった。
具体的には以下のSQLを用いる。
SELECT * FROM (
SELECT 1 AS a, 2 AS b
UNION ALL SELECT 3, 4
) AS temp;
a b 1 2 3 4
UNION ALLで後ろにSELECTの結果を結合することでVALUESの2個目以降を再現する。UNION ALL SELECTを後ろに継ぎ足せば行が増える。
VALUESが使えないMySQL 5.7やMariaDB 10.3.2まではこの方法でVALUESを再現しよう。