- 締切済み
条件が一致したら特定の形に値を更新するSQL文
ある条件に一致した部分だけ一括更新する、という処理を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
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- yamada_g
- ベストアンサー率68% (258/374)
たとえば、 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/ip_ib_code_string_j.htm こちらのページのようなプロシージャを作ったらうまくいくのかもしれません。 なにかの参考になれば幸いです。
お礼
お返事が遅れてすみません。 やっぱり一発でうまくいくSQLはないですよね・・・。 でもいろいろ勉強になりました。 ありがとうございます。