質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

9554閲覧

PostgreSQLで実行エラーが発生する

yado

総合スコア24

pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/06/01 00:53

ご覧いただきありがとうございます。

以下の簡単なSQLが動きません。
お知恵を拝借したくよろしくお願いいたします。

SQL

1select null 2union all 3select null 4union all 5select 0 6; 7

(Messages
ERROR: UNION types text and integer cannot be matched
LINE 5: select 0
^
SQL state: 42804
Character: 52)

また、以下のSQLは動きます。

SQL

1select null 2union all 3select 0 4union all 5select null 6;

**nullを2つ先に繋げるとtext型に確定される?**のでしょうか。
Documentがあれば参照URLだけでも記載頂けると大変助かります。

諸事情で結合順序は変えたくないのです。

バージョンは10.1です。

皆様どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

select ~ union の場合、unionされるカラムの属性は最初に決定された属性が使用されます。

null自体の型はunknown(不明)です。
但し、union するということは取り敢えず型を決める必要があり、
unknownでない型が採用されますが、unknownしか無い時はtext型が採用されます。
一方で、単に数値だけを記述するとその数値の大きさに合わせた数値型が暗黙で使用されます。

unionの場合型は一致しなければなりませんから、質問のSQLではtextとintegerで型が不一致となりエラーとなります。

SQL

1select null 2union all 3select null 4--↑ text型が採用される

SQL

1select null 2union all 3select 0 4--↑ integer型が採用される

SQL

1select null 2union all 3select null 4union all 5select 0 6--↑ text型が採用された後に、integer型が現れるのでエラーになる

通常最初のselectで型が明示される記述としていれば、問題ありません。

SQL

1select null::int 2union all 3select null 4union all 5select 0

諸事情で結合順序は変えたくないのです。

順序はorder byによってのみ保証されます。
単に記述した順序で順番が意図通りになっていたとしてもそれは保証されているものではありません。
union all という記述があるので、その順番に展開されているに過ぎません。

投稿2018/06/01 02:05

編集2018/06/01 02:22
sazi

総合スコア25186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yado

2018/06/01 02:14

これです! スッキリしました、ありがとうございました。
yado

2018/06/01 02:52

これに従ってそうな挙動ですね。 ありがとうございます。
sazi

2018/06/01 03:04

>m6u さん フォローありがとうございます。
guest

0

ベストアンサー

最初のNULLをCASTでデータ型を明示してあげては? 型キャスト

投稿2018/06/01 01:00

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yado

2018/06/01 01:10

なるほど、nullをCASTするのですね。 0のCASTばかり考えてました。 nullの型確定のタイミングについてはどのようにお考えでしょうか? お手数ですがお時間ありましたらお願いいたします。
Orlofsky

2018/06/01 01:16

NULLはデータ型を持っていないから、 CAST(NULL AS INTEGER) などでデータ型を指定すれば良いだけでは?
yado

2018/06/01 01:42

確かに目的のことを行うのはそれで達成されるのですが、 何故始めのnullで型確定が行われないのかなと思いまして、、、 nullはデータ型を持っていないから、 1つ目ではなく2つ目で型確定が行われるというのは私には納得がいかないのです。 しかし、そこを突き詰めても仕方がありませんね。 今回はnullをCASTすることで対応したいと思います。 大変助かりました。ありがとうございました。
Orlofsky

2018/06/01 01:52

憶測ですが、最初のUNION ALLでNULLをつなげたが、次のUNION ALLで数値が出てきて、データ型が不明のNULLと数値とのUNIONはダメ、って怒られているのでは? 最初から SELECT COALESCE(NULL, 0) にすれば良いかも?
yado

2018/06/01 02:10

select null union all select 0 ↑はうまくいくので、UNION ALLを行う際に型確定する仕様なんでしょうかね。 (断定は危険ですけど) NULL NULL 0 と出力したいので、COALESCE(NULL, 0) をNULLに適用出来ません。 (0は意味がありません)
yado

2018/06/01 02:17

上の方にご回答頂いた内容で解決しました。 質問の仕方が悪く、申し訳ございませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問