人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLについて教えてください。使用しているのはMYSQLです。

TABLE1があります。フィールドは、
ID,
NAME(VARCHAR)
BIKO1(INT)
BIKO2(INT)
BIKO3(INT)
です。

・IDには文字列が入っています。長さはバラバラです。
・BIKO1?BIKO3は数値が入っています。
・BIKO1が0または3の時、IDの末尾のみをyに変更。(例:0001がIDに入っていた場合は000yに変換)
・BIKO2が1意外の場合(<>1)、IDの末尾のみをsに変更。(例:0001がIDに入っていた場合は000sに変換)

CASE WHENでわけて、replace関数、len関数あたりを組み合わせれば式が作れそうなかんじがしますが、思いつきません。
どういった式をたてれば上記の条件が実現できるでしょうか?

●質問者: popattack
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:?B CASE len MySQL name
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● うぃんど
●27ポイント

BIKO1とBIKO2の関係性があいまいなため下記の条件としています

「BIKO1が0または3の時はy、BIKO1が0でも3でもなくBIKO2が1以外はs、それ以外は何もしない」

まずは下記SELECT文で望みどおりか確認してみてください

SELECT ID = CONCAT(LEFT(ID,CHAR_LENGTH(ID) - 1), (CASE WHEN BIKO1 IN (0,3) THEN 'y' ELSE 's' END)
FROM TABLE1
WHERE BIKO1 IN (0,3) OR BIKO2 <> 1

望みどおりならUPDATE文に置き換えて実行

UPDATE TABLE1
SET ID = CONCAT(LEFT(ID,CHAR_LENGTH(ID) - 1), (CASE WHEN BIKO1 IN (0,3) THEN 'y' ELSE 's' END)
WHERE BIKO1 IN (0,3) OR BIKO2 <> 1

望みどおりでない場合はBIKO1とBIKO2の条件を返信欄へ

◎質問者からの返答

ご回答ありがとうございました。MYSQLはwindows用のMYSQL5.5.10です。大変失礼しました。

ご回答頂きました内容で問題無く実行できました。

ただし、chuken_kenkouさんが言われる、「どちらの条件にも合致する場合」もありました。

BIKO1 IN(0,3) の場合と、 BIKO2<>1 の条件が合致してしまった場合は、末尾に'y'を付ける方を優先したい場合、どのように行えばよいでしょうか?

ちなみにデータ数は1万も無い程度です。


2 ● chuken_kenkou
●27ポイント ベストアンサー

MySQLの質問をする場合、MySQL 5.0、5.1といったレベルまで、最低限、バージョンを提示するようにしてください。大きな機能拡張、一部の仕様変更があります。


どちらの条件にも合致する場合、優先度はどうするのでしょうか?



テストのための定義&データ

drop table if exists table1;
create table table1
(seq int primary key auto_increment -- テストの検証のため、追加
,id varchar(5)
,name varchar(10)
,biko1 int
,biko2 int
,biko3 int
);

insert into table1(id,biko1,biko2,biko3) values
 ('0001',0,0,null)
,('0002',3,0,null)
,('0003',10,1,null)
,('0004',10,10,null)
--
,('1',0,0,null)
,('2',3,0,null)
,('3',10,1,null)
,('4',10,10,null)
,('11',0,0,null)
,('22',3,0,null)
,('33',10,1,null)
,('44',10,10,null)
;


まずは、更新せずに表示だけ

select
 *
 ,concat(left(id,char_length(id)-1)
 ,case when biko1 in(0,3) then 'y'
 when biko2<>1 then 's'
 else right(id,1)
 end
 ) as new_id
 from table1
 order by seq
; 


更新する

update table1
 set id=concat(left(id,char_length(id)-1)
 ,case when biko1 in(0,3) then 'y'
 when biko2<>1 then 's'
 else right(id,1)
 end
 ) 
 where biko1 in(0,3)
 or biko2<>1
;

母体データ件数は、どのくらいあるのでしょうか?

もし数万件といったレベルなら、検索条件での絞り込みは不要かも知れません。

もしデータ件数が相当に多いなら、インデクスを定義し、検索条件で絞り込むといったことを考えた方がいいでしょう。

◎質問者からの返答

ご回答ありがとうございました。MYSQLはwindows用のMYSQL5.5.10です。大変失礼しました。

ご回答頂きました内容で問題無く実行できました。

ただし、chuken_kenkouさんが言われる、「どちらの条件にも合致する場合」もありました。

BIKO1 IN(0,3) の場合と、 BIKO2<>1 の条件が合致してしまった場合は、末尾に'y'を付ける方を優先したい場合、どのように行えばよいでしょうか?

ちなみにデータ数は1万も無い程度です。


3 ● あすか
●26ポイント

下式のように2つに分けてみてください。

もちろん、IDは十分な長さのある文字列型という前提です。

UPDATE TABLE1 SET ID=CONCAT(SUBSTRING(ID, 1, LENGTH(ID) - 1), 'y') WHERE BIKO1=0 OR BIKO1=3;
UPDATE TABLE1 SET ID=CONCAT(SUBSTRING(ID, 1, LENGTH(ID) - 1), 's') WHERE BIKO2<>1;
◎質問者からの返答

ご回答ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ