SQL Server のクエリ文でデータを抽出したいのですが、
テーブルに格納されたデータの先頭にゼロが付加されているため、
文字列の前ゼロを削除した値を取得したいと思っています。
実際には以下のようなデータが格納されています。
変換前のカラム値
ID
00000
00123
000土地
Null
‘’(空文字)
↓↓↓
変換したい値
ID
0
123
土地
Null
‘’(空文字)
期待したデータを抽出するSQLを教え頂けるでしょうか?
DB環境の関係で
ストアドファンクションを作成したものを使用できず、
困っています。
何卒、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
「000土地」が無ければいけるんですけどね…
と思ったけど「00123.000」も後ろの0が取れちゃいますね
【追記】
ちょっと思いついたのですごく泥臭い方法も書いてみました。
sql
1WITH REC AS ( 2 SELECT '00000' AS Val UNION ALL 3 SELECT '00123' AS Val UNION ALL 4 SELECT '00123.000' AS Val UNION ALL 5 SELECT '000土地' AS Val UNION ALL 6 SELECT NULL AS Val UNION ALL 7 SELECT ' ' AS Val 8) 9SELECT Val 10 11-- 一旦数値に変換する方法。これだと数字以外が混ざっている場合にNG。また小数点以下が落ちる等の問題もある 12, CASE ISNUMERIC(Val) WHEN 1 THEN CONVERT(nvarchar, CONVERT(float, Val)) ELSE Val END 13 14-- 0 の数がある程度決まっているなら泥臭い方法でいけなくも、ない…? 15-- 先頭7桁がALL0なら8桁目以降を採用、的なやつ 想定される 0 の数だけ WHEN を用意 16, CASE 17 WHEN LEN(Val) > 7 AND LEFT(Val, 7) = '0000000' THEN SUBSTRING(Val, 8, LEN(Val)) 18 WHEN LEN(Val) > 6 AND LEFT(Val, 6) = '000000' THEN SUBSTRING(Val, 7, LEN(Val)) 19 WHEN LEN(Val) > 5 AND LEFT(Val, 5) = '00000' THEN SUBSTRING(Val, 6, LEN(Val)) 20 WHEN LEN(Val) > 4 AND LEFT(Val, 4) = '0000' THEN SUBSTRING(Val, 5, LEN(Val)) 21 WHEN LEN(Val) > 3 AND LEFT(Val, 3) = '000' THEN SUBSTRING(Val, 4, LEN(Val)) 22 WHEN LEN(Val) > 2 AND LEFT(Val, 2) = '00' THEN SUBSTRING(Val, 3, LEN(Val)) 23 WHEN LEN(Val) > 1 AND LEFT(Val, 1) = '0' THEN SUBSTRING(Val, 2, LEN(Val)) 24 ELSE Val 25 END 26 27FROM REC 28
投稿2017/11/16 04:24
編集2017/11/16 06:14総合スコア1126
0
試せてないけど、こんな感じではどうでしょうか。
全て'0' なら'0'、それ以外は'0'を空文字に置換する。
SQL
1case when replicate('0',len(ID))=ID then '0' else replace(ID,'0','') end
もし、空白が含まれているとしたら、trim()を使用
SQL
1case when replicate('0',len(ltrim(rtrim(ID))))=ltrim(rtrim(ID)) then '0' else replace(ltrim(rtrim(ID)),'0','') end
修正
数値と空白を全て空文字にして、結果が''なら全て数字、
・数値に変換して文字に変換(0サプレス)
それ以外は数字と空白を除去
前回同様に試せていません。
SQL
1case when translate(ID,'0123456789 ','')='' then 2 convert(varchar, convert(int, ID)) 3else 4 translate(ID,'0123456789 ','') 5end
投稿2017/11/15 14:46
編集2017/11/16 10:21総合スコア25430
0
0を半角スペースに置換してから ltrim
して、さらに半角スペースを0に置換する、とかですかね?
元の値に半角スペースが入っていない、という前提付きになってしまいますが。
00000は0にしたいようなので、上記の結果が空文字になったら0にする、というのも追加すれば、たぶんお望みの結果が得られるのではないでしょうか。
※元の値が空文字だった場合はどうしたいのでしょうか?
(11/16追記)
ベタに書けば、こんな感じでしょうか。
sql
1case 2 when ID='' then '' 3 when ID is null then null 4 when replicate('0',len(ID))=ID then '0' 5 else replace(ltrim(replace(ID,'0',' ')),' ','0') 6end
動作確認:
sqlfiddleでの実行結果
投稿2017/11/15 11:43
編集2017/11/16 10:23総合スコア2019
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。