質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

Q&A

解決済

1回答

5306閲覧

SQL:文字+数値文字列のデータの加算方法について

Beer_Rabbit

総合スコア70

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

0グッド

0クリップ

投稿2022/01/12 04:21

SQLServer(Transact-SQL)にて

数値文字列のデータで、
A0008
に、1を足し算して「A0009」にしたい場合
どのような方法がございますか。

このデータが入っているカラムの
MAX値に加算をするのが目的です。

ご教授のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
A0009AA003AAA05

があるとし、'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
ababa_Sigrun

総合スコア281

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Beer_Rabbit

2022/03/10 23:14

質問内容が、漠然としたものに対して 大変ご丁寧に解説くださり、誠にありがとうございます。 順を追って説明いただいたので、理解しやくすく勉強になりました。 ちなみに、 ご推測されたとおり、データの中に、AA0001、BBB01のようなデータが 混在した場合に、下記の場合はどのように記述することになりますか。 ----------------- アルファベットが複数文字ならばそのアルファベットの後ろが数値であることも条件にいれて調べることで取得可能です。 ISNUMERIC関数とLEFTを組み合わせることで実装可能かと思います。 -------------
Beer_Rabbit

2022/03/11 11:30

追記していただいた部分について 理解でき大変助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問