[pgsql-jp: 33391] Re: Postgresql7.4.2 char列に対するmax関数の動作が7.3.3と異なる

ISHIDA Akio iakio @ mono-space.net
2004年 6月 26日 (土) 16:01:00 JST


石田@苫小牧市です。
すいません。ちょっと違ってたみたいです。

おそらく、text型を引数にとるmax()という集合関数はあるが
char型を引数にとるものは無いので、max(char型のフィールド)
としたときに、text型へ暗黙の型変換が行なわれたため、
" " が "" なってしまったものと思われます。

みっともない方法ですが、あらかじめtextにしておいてから
rpad()でスペースを追加してやれば回避できそうです。

SELECT max(rpad(row1::text, 1, ' ')),2 from tmptable ;

# でもこれじゃあchar型つかう意味ないですねぇ。

あるいは、char型を扱うmax()があれば良いのかもしれません。

また、私が最初にあげた
SELECT '<' || ' '::char(5) || '>';
という例についても、暗黙の型変換の結果だと思います。
(ここはちゃんと調べてませんが)。

On Thu, Jun 24, 2004 at 09:36:58AM +0900, aya wrote:
> 「これは、ほとんどのユーザが常にそうなってほしいと期待
> している動作です。 」
> とありますが、
> 
> 以下、石田さんのプログラム例や私のプログラム例の時に
> 該当するか?
> 
> というと、どうなんだろう?
> 私はおかしいように感じます。
> 
> charをvarcharやtext型に変換するときの
> 後続ブランクを除くというのは、
> 「char型"AAAA    "というデータをvarcharに変換するとき」
> と思うですが、これはどのようなときかというと、、
> 
> insert into A_table select * from B_tableという
> 
> ような構文があったときに、A_tableの列がvarcharで
> B_tableの列がcharの時を指すように思います。
> 
> このときでもchar(10)をvarchar(20)に入れるとき、
> "AAAA   "を入れるときに"AAAA"にするか
> "AAAA   "にするかは微妙かと思うのですが、
> " "というようにブランク一文字しかないときに、
> ""というように詰めてしまってよいかというと
> 期待していない動きに感じます、、、

RDBMS一般のことや、このような仕様変更があった経緯は
わかりませんが、私もこれはちょっとわかりづらいところだ
という気はします。

どうなんでしょうか > 識者のかた(ひき続き)




pgsql-jp メーリングリストの案内