SQLServer(Transact-SQL)にて
数値文字列のデータで、
A0008
に、1を足し算して「A0009」にしたい場合
どのような方法がございますか。
このデータが入っているカラムの
MAX値に加算をするのが目的です。
ご教授のほどよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
【疑問点】
・AだけでなくBなども混在していますか。
・AのMAXだけ加算するのが目的でしょうか。
・最初の英字は必ず1文字だけでしょうか。
・重複もないでしょうか。
疑問点があるのでSQLを書くことができませんがやり方として
1.該当となる対象を探す。
2.該当を更新する。
という手順が必要だと思います。
とりあえず1について記載していこうと思います。
・WHERE句でまず対象のアルファベットのみをSELECTできるようにしましょう。
LEFT関数を使うことで対象を抽出できます。
※アルファベットが1文字固定ならば以下で取得可能です。
SQL
1WHERE 2 LEFT(カラム名,1) ='A'
アルファベットが複数文字ならばそのアルファベットの後ろが数値であることも条件にいれて調べることで取得可能です。
ISNUMERIC関数とLEFTを組み合わせることで実装可能かと思います。
次に取得した特定のアルファベットの中からMAXを取得するために数字部分を取得します。
ここでは
A0009の0009を取得します。
SUBSTRING関数またはRIGHT関数を使用します。
SQL
1RIGHT(カラム名,対象データの長さ-検索対象アルファベットの長さ) 2RIGHT(カラム名,LEN(カラム名)-LEN('A'))
とすることで
0009の部分だけ取得したのでゼロサプレスを行います。
SQL
1convert(int,'0009') 2convert(int, RIGHT(カラム名,LEN(カラム名)-LEN('A')))
とすると一覧で数字化してるのでMAXを使い最大値を取得します。
SQL
1MAX(convert(int, RIGHT(カラム名,LEN(カラム名)-LEN('A')))) 2,カラム名
UPDATEするデータの抽出ができたのでUPDATEします。
※余談ですがカラム名も一緒にSELECTに追加すると数値化する前のものが見えて便利かもしれないです。
#追記分
アルファベットが複数文字ならばそのアルファベットの後ろが数値であることも条件にいれて調べることで取得可能です。
ISNUMERIC関数とLEFTを組み合わせることで実装可能かと思います。
質問があったので、上記に対する追記をします。
例として
項目の値1 | 項目の値2 | 項目の値3 |
---|---|---|
A0009 | AA003 | AAA05 |
があるとし、'AA'を取得したいとします。
SQL
1WHERE LEFT(項目名,LEN('AA')) = 'AA' 2-- または 3WHERE LEFT(項目名,2) = 'AA'
上記だとAAA05も取得してしまうので、
3文字目が数字かどうかをチェックします。
SQL
1LEFT(項目名,3)
とすると
3文字とってしまうのでRIGHTを組み合わせて
その3文字の右から1文字を取得します。(SUBSTRINGで一気にやっても良いと思いますが分かりやすそうなこちらを説明します)
SQL
1RIGHT(LEFT(項目名,3),1) 2
これで3文字目の文字だけを取得することができました。
ISNUMERIC関数を使い判定することで数字なら1文字列なら0を返してくれるので
SQL
1WHERE 2 LEFT(項目名,LEN('AA')) = 'AA' 3AND 4 ISNUMERIC(RIGHT(LEFT(項目名,3),1))=1
とすることで取得可能です。
投稿2022/03/10 05:24
編集2022/03/11 05:53総合スコア281
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/10 23:14
2022/03/11 05:53
2022/03/11 11:30