RedshiftでVALUES句が使えないと思ったら、Postgresと違うだけだった話
投稿日: 2026/05/06
更新日: 2026/05/06
RedshiftでVALUES句が使えないと思ったら、Postgresと違うだけだった話
これは...私がAWSのRedshiftを触る機会があり、SQLを作成したときの話です。
当時私はRedshiftはPostgres互換だと聞いていて、作成したSQLをPostgresでテストし問題なく動作することを確認したんです。
特に嫌だな~って感じはなかったんですけど...出たんですよ...
sqlERROR: syntax error at or near "("
が!!
私は最初、SQLを書き間違えたかと思ったんです、でも、どんなに見直してみても間違いが見つからない...
おかしい...
もしかして...
私はAWSのRedshiftのドキュメントを見に行きました。
そしたら...書いてあったんですよ...
サポートされていないPostgresの機能に「VALUES list used as constant tables」と!!
動かないSQL
というわけで、Postgresで動くSQLがなぜか動かない事象の体験録でした。
動かなかったSQLは以下のようなSQLで、
sqlWITH t AS ( VALUES (1, 'Alice'), (2, 'Bob') ) SELECT * FROM t;
これをRedshiftで実行するとエラーになります。
最初は、SQLの間違いかと思っていたわけですがそういうわけでもない。
そしたら、AWS公式のサポートしていないPostgresの機能ドキュメントに「定数テーブルとして使用される VALUES リスト」と書かれていたんですね。
実際は「VALUES句が使えない」わけではない
ここで厄介なのは、VALUES句そのものが非対応というわけではないという点です。
例えば、以下のようなSQLは動きます。
sqlINSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob');
つまり、
- VALUES句自体はある
- ただしPostgresと同じ感覚では使えない
という状態。
...なんでよ
「Postgres互換」だと思っていた
RedshiftはPostgresベースですし、 実際に psql でも接続できます。(サポートされていませんとは書かれていますが)
実際にはほぼ別物です。
- オンライントランザクション処理 (OLTP)向けのPostgres
- オンライン分析処理 (OLAP)向けのRedshift
ですから、そもそも用途が違います。
さらにRedshiftは独自進化しているため、Postgresとの差分も少しずつ増えているようです。
とはいえ、Postgres互換かつ、追加で別の機能も使えるみたいな方式じゃないのはなぜなんでしょうね?開発コストでしょうか...
さらに混乱したポイント
psqlで接続という記事がかなり多いので、 「Postgres互換」という印象を持っていたわけですが、AWSとしては、Redshift専用の接続方法を推奨しています。
例えば:
- Redshift Data API
- Redshift JDBC/ODBC Driver
- Redshift Connector
などですね。
つまり、
「Postgresに似ている」
≠
「Postgresそのもの」
ということでした。
私は、少なくとも完全互換ではないということは覚えておこうと思います。
回避方法
ところで、今回のケースでは、 UNION ALL を使えば回避できます。
sqlWITH m AS ( SELECT 1 AS id, 'A' AS code UNION ALL SELECT 2, 'B' ) SELECT * FROM fact JOIN m ON fact.id = m.id
少し冗長ですが、Redshiftではこちらの方が安定しそうです。
まとめ
- RedshiftはPostgres互換というより、「Postgres風の別物」として見るのがよさそう
- 公式ドキュメントを確認しましょう
以上
