MYSQLについてお教えください。MYSQLのテーブルは下のようになります。


テーブル:TABLE_A、フィールド:ID,NAME

IDフィールドには数値が入力されています。例えば8桁や13桁などです。
やりたいことはupdateです。だたし、そのやり方がわかりません。

条件は、
IDの数値の長さが7以下の場合、頭に0を足して8桁にする。例えば「12345」の場合は、「00012345」にする。
IDの数値の長さが9以上、12以下は頭に0を足して13桁にする。例えば「123456789」の場合は、「0000123456789」にする。
8桁、13桁のものは何もしない。

上記のことが解決できるSQL文をお教えください。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/02/10 12:09:54
  • 終了:2011/02/13 00:09:11

ベストアンサー

id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542011/02/10 15:18:55

ポイント40pt

こんな感じでどうでしょう。

update table_A
 set id=case when char_length(id)<=7      then lpad(id,8,'0')
             when char_length(id)>=9 
                  and char_length(id)<=12 then lpad(id,13,'0')
             else id
        end
;

ちなみに、以下のデータでテストしてみました。

drop table if exists table_a;
create table table_a
(id          varchar(20)
,name        varchar(20)
);

insert into table_a values
 ('1',null)
,('12',null)
,('123',null)
,('1234',null)
,('12345',null)
,('123456',null)
,('1234567',null)
,('12345678',null)
,('123456789',null)
,('123456789A',null)
,('123456789AB',null)
,('123456789ABC',null)
,('123456789ABCD',null)
,('123456789ABCDE',null)
;
id:popattack

ご回答ありがとうございます!!試してみます!!

2011/02/12 01:29:49

その他の回答(2件)

id:asuka645 No.1

あすか回答回数856ベストアンサー獲得回数972011/02/10 12:46:27

ポイント20pt

IDは文字列型という前提ですが、以下のようになります。

UPDATE TABLE_A SET ID=RIGHT(CONCAT('0000000',ID),8) WHERE CHAR_LENGTH(ID)<=7;
UPDATE TABLE_A SET ID=RIGHT(CONCAT('000000000000',ID),13) WHERE CHAR_LENGTH(ID)>=9 AND CHAR_LENGTH(ID)<=12;
id:popattack

ご回答ありがとうございます!試してみます!

2011/02/10 14:01:51
id:taknt No.2

きゃづみぃ回答回数13538ベストアンサー獲得回数11982011/02/10 13:14:52

ポイント40pt

未確認ですが こんな感じにすればいいかと思います。


UPDATE TABLE_A set

ID =

( case

when length(ID) <= 8 then lpad(ID, 8, '0');

when length(ID) <= 13 then lpad(ID, 13, '0');

end )

id:popattack

ご回答ありがとうございます!試してみます!1点教えてください。length(ID) <= 13 then lpad(ID, 13, '0');について。

これは8桁ジャストのものも13桁にしてしまわないでしょうか?8桁ジャストのものは13桁にはしたくありません。

2011/02/10 14:05:12
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542011/02/10 15:18:55ここでベストアンサー

ポイント40pt

こんな感じでどうでしょう。

update table_A
 set id=case when char_length(id)<=7      then lpad(id,8,'0')
             when char_length(id)>=9 
                  and char_length(id)<=12 then lpad(id,13,'0')
             else id
        end
;

ちなみに、以下のデータでテストしてみました。

drop table if exists table_a;
create table table_a
(id          varchar(20)
,name        varchar(20)
);

insert into table_a values
 ('1',null)
,('12',null)
,('123',null)
,('1234',null)
,('12345',null)
,('123456',null)
,('1234567',null)
,('12345678',null)
,('123456789',null)
,('123456789A',null)
,('123456789AB',null)
,('123456789ABC',null)
,('123456789ABCD',null)
,('123456789ABCDE',null)
;
id:popattack

ご回答ありがとうございます!!試してみます!!

2011/02/12 01:29:49
  • id:y-kawaz
    回答制限に引っかかってるっぽく回答欄が表示されません…。
  • id:chuken_kenkou
    MySQLのバージョンは、何ですか? MySQL 4.1、5.0、5.1といったレベルまでは最低限提示してください。

    ID列のデータ型は、何ですか?
    負の値は存在しないのでしょうか?
    先頭に0を付加したものは、その後、計算に使ったりしないですね?
  • id:popattack
    y-kawazさん>回答制限はかけてないのですが・・・

    chuken_kenkouさん>ID、NAMEともにvarchar(20)で設定しています。IDはあくまでIDなので計算には使用しません。
  • id:taknt
    >length(ID) <= 13 then lpad(ID, 13, '0');について。

    これは8桁ジャストのものも13桁にしてしまわないでしょうか?8桁ジャストのものは13桁にはしたくありません。


    多分 大丈夫かと思うんですが、ダメでしたら
    when length(ID) <= 13 then lpad(ID, 13, '0')


    else lpad(ID, 13, '0')
    にすればいいでしょう。

    後ろについてた ;は ゴミでした。
    削除してください。

  • id:windofjuly
    うぃんど 2011/02/10 21:37:58
    (' 1 ',null) も考慮しておく必要があるような気がします……
  • id:taknt
    >IDフィールドには数値が入力されています。
    これが 前提条件なら NULLは 考慮しなくてもいい。
  • id:windofjuly
    うぃんど 2011/02/11 01:06:33
    >>IDフィールドには数値が入力されています。
    >これが 前提条件なら NULLは 考慮しなくてもいい。
     
    よーーーくよーーく見てくださいね
    そんなところに注目すべき点はないですよ
  • id:popattack
    takntさん、windofjulyさんご回答ありがとうございました。感謝です。
  • id:sayo213sayo
    コメント荒らし キタ━━(━(━(-( ( (゚∀゚) ) )-)━)━) ━━ !!!!!
     
    回答拒否られているのに他人のコメントにケチを付ける傲岸不遜ぶり

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません