データベースに登録されている内容を固定長のファイルに出力する必要があったので、面倒な編集をSQLで行ってファイル出力処理の簡略化を行ってみます。
登録されている内容を固定長で出力
データベースに登録されている内容を固定長のファイルに出力する必要があったので、面倒な編集をSQLで行ってファイル出力処理の簡略化を行ってみます。
1.サンプルの仕様
サンプルの仕様として
- 都道府県名を20バイト固定で後ろ、全角スペース埋めで出力
- 該当件数を20バイト固定で後ろ、半角スペース埋めで出力
- 該当件数を20バイト固定で前、半角0埋めで出力
2.テーブルの作成
サンプルとしてデータを格納するためのテーブルを作成します。
CREATE TABLE test_table( seq int ,name varchar(20) ,num int )
それぞれの項目は
- seq レコードをユニークにするためのキー
- name 都道府県名
- num 該当件数
です。
3.データの作成
出力するためのデータを作成します。
insert into test_table VALUES (1,'大阪', 10) insert into test_table VALUES (2,'京都', 7) insert into test_table VALUES (3,'奈良', 4) insert into test_table VALUES (4,'兵庫', 6) insert into test_table VALUES (5,'和歌山', 2) insert into test_table VALUES (6,'滋賀', 0)
内容は適当に。
4.固定長での項目取得
各項目を指定の固定長で取得します。
SELECT CONVERT( VARCHAR, name ) + REPLICATE( '■', ( 20 - DATALENGTH( CONVERT( VARCHAR, name ))) / DATALENGTH( CONVERT( VARCHAR, '■' ))) + REPLICATE( '.' , ( 20 - DATALENGTH( CONVERT( VARCHAR, num ))) / DATALENGTH( CONVERT( VARCHAR, '.' ))) + CONVERT( VARCHAR, num ) + REPLICATE( '0' , ( 20 - DATALENGTH( CONVERT( VARCHAR, num ))) / DATALENGTH( CONVERT( VARCHAR, '0' ))) + CONVERT( VARCHAR, num ) FROM test_table ORDER BY seq
です。
5.表示結果
表示結果は
大阪■■■■■■■■..................1000000000000000000010
京都■■■■■■■■...................700000000000000000007
奈良■■■■■■■■...................400000000000000000004
兵庫■■■■■■■■...................600000000000000000006
和歌山■■■■■■■...................200000000000000000002
滋賀■■■■■■■■...................000000000000000000000
表示結果をわかりやすくするために全角スペースを「■」、半角スペースを「.」に
変更してあります。
REPLICATE()は指定された文字を、指定された回数表示する関数です。
SQLServerのTransact-SQL(T-SQL)関数なのでOracleやPostgreSQL、MySQLでは関数を変える必要があります。(環境がないので調べてません。)
内容としてはDATALENGTH()関数で取得した値のバイト数(長さ)を求めREPLICATE()を固定長に不足分のバイト数分、埋めるべき文字を生成し、元データと連結しています。
埋めるべき文字数を求めるのに
全体の長さ - ( DATALENGTH( CONVERT( VARCHAR, name ))) / DATALENGTH( CONVERT( VARCHAR, '■' ))) 全体の長さ - ( 出力する文字列の長さ / 埋める文字のバイト数 )
にしてあるのは全角文字、半角文字をしていされても同じ結果にするためです。
(全角文字の場合は「÷2」、半角文字の場合は「÷1」になります。)
これでデータベースから取得した結果は固定長になるので、あとはこの結果をファイルに出力すれば良いだけです。