回答編集履歴

4 推敲

sazi

sazi score 12716

2018/06/01 11:22  投稿

select ~ union の場合、unionされるカラムの属性は最初に決定された属性が使用されます。
null自体の型はunknown(不明)です。
但し、union するということは取り敢えず型を決める必要があり、
unknownでない型が採用されますが、unknownしか無い時はtext型が採用されます。
一方で、単に数値だけを記述すると暗黙の型はintegerです。
一方で、単に数値だけを記述するとその数値の大きさに合わせた数値型が暗黙で使用されます。
unionの場合型は一致しなければなりませんから、textとintegerで型が不一致となりエラーとなります。
unionの場合型は一致しなければなりませんから、質問のSQLではtextとintegerで型が不一致となりエラーとなります。
```SQL
select null
union all
select null
--↑ text型が採用される
```
```SQL
select null
union all
select 0
--↑ integer型が採用される
```
```SQL
select null
union all
select null
union all
select 0
--↑ text型が採用された後に、integer型が現れるのでエラーになる
```
通常最初のselectで型が明示される記述としていれば、問題ありません。
```SQL
select null::int
union all
select null
union all
select 0
```
> 諸事情で結合順序は変えたくないのです。
順序はorder byによってのみ保証されます。
単に記述した順序で順番が意図通りになっていたとしてもそれは保証されているものではありません。
union all という記述があるので、その順番に展開されているに過ぎません。
3 推敲

sazi

sazi score 12716

2018/06/01 11:16  投稿

select ~ union の場合、unionされるカラムの属性は最初に決定された属性が使用されます。
null自体の型はunknown(不明)です。
但し、union するということはマージが発生するので、取り敢えず型を決める必要があり、
但し、union するということは取り敢えず型を決める必要があり、
unknownでない型が採用されますが、unknownしか無い時はtext型が採用されます。
一方で、単に数値だけを記述すると暗黙の型はintegerです。
unionの場合型は一致しなければなりませんから、textとintegerで型が不一致となりエラーとなります。
```SQL
select null
union all
select null
--↑ text型が採用される
```
```SQL
select null
union all
select 0
--↑ integer型が採用される
```
```SQL
select null
union all
select null
union all
select 0
--↑ text型が採用された後に、integer型が現れるのでエラーになる
```
通常最初のselectで型が明示される記述としていれば、問題ありません。
```SQL
select null::int
union all
select null
union all
select 0
```
> 諸事情で結合順序は変えたくないのです。
順序はorder byによってのみ保証されます。
単に記述した順序で順番が意図通りになっていたとしてもそれは保証されているものではありません。
union all という記述があるので、その順番に展開されているに過ぎません。
2 推敲

sazi

sazi score 12716

2018/06/01 11:15  投稿

null自体の型はunknown(不明)です。
但し、union するということはマージが発生するので、取り敢えず型を決める必要があり、
unknownでない型が採用されますが、unknownしか無い時はtext型が採用されます。
一方で、単に数値だけを記述すると暗黙の型はintegerです。
unionの場合型は一致しなければなりませんから、textとintegerで型が不一致となりエラーとなります。
```SQL
select null
union all
select null
--↑ text型が採用される
```
```SQL
select null
union all
select 0
--↑ integer型が採用される
```
```SQL
select null
union all
select null
union all
select 0
--↑ text型が採用された後に、integer型が現れるのでエラーになる
```
通常最初のselectで型が明示される記述としていれば、問題ありません。
```SQL
select null::int
union all
select null
union all
select 0
```
> 諸事情で結合順序は変えたくないのです。
順序はorder byによってのみ保証されます。
単に記述した順序で順番が意図通りになっていたとしてもそれは保証されているものではありません。
union all という記述があるので、その順番に展開されているに過ぎません。
1 推敲

sazi

sazi score 12716

2018/06/01 11:06  投稿

select ~ union の場合、unionマージされるカラムの属性は最初に決定された属性が使用されます。
null自体の型はunknown(不明)です。
但し、union するということはマージが発生するので、取り敢えず型を決める必要があり、
unknownでない型が採用されますが、unknownしか無い時はtext型が採用されます。
一方で、単に数値だけを記述すると暗黙の型はintegerです。
unionの場合型は一致しなければなりませんから、textとintegerでが不一致となりエラーとなります。
unionの場合型は一致しなければなりませんから、textとintegerでが不一致となりエラーとなります。
```SQL
select null
union all
select null
--↑ text型が採用される
```
```SQL
select null
union all
select 0
--↑ integer型が採用される
```
```SQL
select null
union all
select null
union all
select 0
--↑ text型が採用された後に、integer型が現れるのでエラーになる
```
通常最初のselectで型が明示される記述としていれば、問題ありません。
```SQL
select null::int
union all
select null
union all
select 0
```
> 諸事情で結合順序は変えたくないのです。
順序はorder byによってのみ保証されます。
単に記述した順序で順番が意図通りになっていたとしてもそれは保証されているものではありません。
union all という記述があるので、その順番に展開されているに過ぎません。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る