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を再現しよう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です