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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

Q&A

3回答

36242閲覧

SQLServerでゼロサプレス(前0削除)をしたい

shun1

総合スコア7

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

0グッド

0クリップ

投稿2017/11/15 04:36

編集2017/11/15 14:31

SQL Server のクエリ文でデータを抽出したいのですが、
テーブルに格納されたデータの先頭にゼロが付加されているため、
文字列の前ゼロを削除した値を取得したいと思っています。

実際には以下のようなデータが格納されています。

変換前のカラム値
ID

00000
00123
000土地
Null
‘’(空文字)

↓↓↓

変換したい値
ID

0
123
土地
Null
‘’(空文字)

期待したデータを抽出するSQLを教え頂けるでしょうか?

DB環境の関係で
ストアドファンクションを作成したものを使用できず、
困っています。

何卒、よろしくお願いいたします。

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

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

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

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

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

guest

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

総合スコア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
sazi

総合スコア25173

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

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

alg

2017/11/16 00:44

これだと、前ゼロだけでなく後ゼロも削除されてしまいませんか?
shun1

2017/11/16 03:20

そうですね。すべての0が削除されてしまうようです。 例) 120000 =>12 100007 =>17 000001 =>1
sazi

2017/11/16 10:02

algさんの、 >0を半角スペースに置換してから ltrim して、さらに半角スペースを0に置換する というのはそういう事ですね。 出直しですね。
guest

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
alg

総合スコア2019

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

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

shun1

2017/11/15 13:30

回答ありがとうございます。 > ※元の値が空文字だった場合はどうしたいのでしょうか? 元の値がNULL及び空文字の場合もあり、その場合はデータ編集しないため、 NULL及び空文字のままである必要があります。 ※半角スペースはデータに含まれていません。 そのため、0を半角スペースに置換してから ltrim して、さらに半角スペースを0に置換すると、 空文字が0になってしまうため、困っているところです。 よろしくお願いいたします。
alg

2017/11/15 13:45

そういった内容は、質問文にも反映したほうがいいですよ。
shun1

2017/11/15 14:31

ご指摘感謝です。 例を更新させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問