いちばん失敗した人決定戦

ある条件に一致した部分だけ一括更新する、という処理をSQLで行いたいのですが、なにぶん初心者なもので要領をえません。どなたか知恵を授けていただけないでしょうか。

やりたいことなのですが、下のようにAテーブルがあって、その中に文字列型(8)のnumStrフィールドがあるとします。このフィールドに入っている値は「4桁の半角数字」か「6桁の半角数字」、あるいは「未記入状態」しかありません。もしこのnumStrフィールドが未記入ではないとき、値が6桁ならリーディング・ゼロ(桁合わせのための頭ゼロ)を2つ、値が4桁ならリーディング・ゼロを4つ追加したいというものです。

データベースはInterbaseを使用していますが、それ以外のデータベースのやり方でも構いません。ヒントだけでも結構です。

その他条件:
(1) numStrとusrNameともに未記入状態が許可されていて、空欄である可能性があります
(2) しかし運用上、numStrとusrNameの両方が空欄になることはありません
(3) numStrとusrNameはユニークな値ではないため、二つのフィールド値がまったく同じレコードが存在する可能性があります
(4)プライマリキーやIDのようなユニーク値のフィールドは設定されていません

説明が足りないところや不明な点はご指摘ください。
よろしくお願いします。

Table A構造:
numStr文字列(最大8文字)
usrName文字列(最大50文字)

現在numStrに格納されている値:
123456
0002
(未記入)
023493
000238
(未記入)
9876

更新によって書き直された値:
(リーディング・ゼロ追加済)
00123456
00000002
(未記入)
00023493
00000238
(未記入)
00009876

A 回答 (1件)

たとえば、



update A
set numStr = case numStrの長さ when 4 then '0000' when 6 then '00' else '' end || numStr
where numStr is not null;

みたいな感じでいいと思うのですが、パッとInterbaseのリファレンスを見た限りでは
文字列の長さを取得する関数はないようですね・・・。

Interbaseについて全く知識がないので的外れかもしれませんが、
http://www.geocities.jp/kimura804/rdb/InterBase/ …
こちらのページのようなプロシージャを作ったらうまくいくのかもしれません。

なにかの参考になれば幸いです。
    • good
    • 0
この回答へのお礼

お返事が遅れてすみません。
やっぱり一発でうまくいくSQLはないですよね・・・。
でもいろいろ勉強になりました。
ありがとうございます。

お礼日時:2013/11/01 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す