intを先行ゼロ付きのcharに変換する方法は?


98

intデータフィールドを先行ゼロ付きのnvarcharに変換する必要があります

例:

1 '001'に変換

867は '000867'などに変換します。

どうも。


これは4時間後の私の応答です...

私はこのT-SQLスクリプトをテストし、うまくいきました!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

このユーザー関数を作成しました

T-SQLコード:

CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
AS
BEGIN

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

    RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal)))) 
        + CONVERT(nvarchar(20),@intVal)

END

例:

SELECT dbo.CIntToChar(867、6)AS COD_ID

出力

000867


1
NCHAR(3)は3の常にな長さがあるので、あなたの最初のサンプルのキャストでは、代わりにNCHAR型のNVARCHARする必要があります
nzeemin

回答:


99

これを試して: select right('00000' + cast(Your_Field as varchar(5)), 5)

5桁の結果が得られます(例:00001、....、01234)


1
postgresの場合、+を||で置き換える必要があることに注意してください。そのためselect right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

56

SQL Server 2012で導入されたFORMAT()関数を使用することもできますhttp://technet.microsoft.com/library/hh213505.aspx

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')

私はSQL2012に同意しますが、SQL 2008r2以前の場合は、私のソリューションで結果が得られます
GoldBishop

1
FORMAT Sql Server 2012をテストしたところ、「数秒に1つの数値」のように遅い。近づかないで。
Muposat

@Muposat、そのテストのコードを提供できますか?それは非常に重要です。前もって感謝します。
DiomedesDomínguez2017年

3
@DiomedesDomínguezもう1年経っているので、元のテストはもうありません。非常に高速なサーバーで別のテストを実行したところ、100万の数値をフォーマットするのに32秒かかりました。世界の終わりではありませんが、Nguyen Tranによって投稿されたソリューションは1秒で完了します。試験に単に10000000に@i INT = 0からループを作成
Muposat

22

REPLICATE先頭のゼロをすべてハードコーディングする必要がないように使用します。

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

出力:

0000000123

13

この質問をハイジャックするのではなく、(N)CHARデータ型の代わりに(N)VARCHARを使用する必要があることに注意する必要があります。

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

上記のセグメントは、SQL 2005から正しい応答を生成しません

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

上記のセグメントは、SQL 2005から望ましい応答を生成します

varcharは、必要なプレフィックス長をその場で提供します。一方、固定長データ型では、長さの指定と調整が必要になります。


6

使いたい

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

これは私に与えます

000000004

1
少しハッキーな感じがしますが、DB2ではうまくいきました。上記の答えが機能しませんでした。
ネイサンM.

2
私も好きです。長さがハードコードされている場合は、RIGHT(1000+Number, 3)
-nice

1
これは、2005年以降のすべてのSQL Serverバリアントで機能します。望ましい答え。
Fandango68

1
10はどういう意味ですか?
Fandango68

1
@ Fandango68上記の「POWER(10、@Length)」の「10」は、10進数の算術演算を使用しているためです。したがって、上記のmaf-soft回答の「1000」リテラルは、POWER(10、3)-10 ^ 3と同等です。 = 1000
qxotk

4

データ型「int」は10桁を超えることはできません。さらに、「Len()」関数はintで機能するため、len()関数を呼び出す前にintを文字列に変換する必要はありません。

最後に、intのサイズ>パディングしたい合計桁数(@intLen)の場合を考慮していません。

したがって、より簡潔で正しい解決策は次のとおりです。

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END

3

あまりエレガントではありませんが、変換したい数値に、必要な先行ゼロの数と同じ設定値を追加し、RIGHT関数を使用します。

例:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

結果: '000867'


2

SQL Server 2008以降の1行ソリューション(それ自体):

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

SIGN式による乗算はと同等MAX(0, @DesiredLenght-LEN([Column]))です。問題は、MAX()引数を1つしか受け入れないことです...


1

私はここに良い記事を見つけました:

文字列に先行ゼロを埋め込む

たとえば、数値列が9文字で、先頭に0を付ける必要がある固定長のデータエクスポートを出力する場合、これを何度も行う必要があります。


1
    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

ところで、それがint列の場合、それでもゼロは保持されません。プレゼンテーションレイヤーで実行するか、SELECTで本当に必要な場合


1

同じ問題があった、これは私が解決した方法です...シンプルでエレガント。"4"は、渡される整数の長さに関係なく、文字列の長さを表し、最大で "4"までゼロが埋め込まれます。

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

1

私の場合、10文字のフィールド(NVARCHAR(10))の先頭に0を付ける必要がありました。ソースファイルには、別のテーブルに結合するために必要な先頭の0がありません。これは単にSQL Server 2008R2を使用していることが原因でしたか?

Set Field = right(( '0000000000' + [Field])、10) (これはSQL2012より前なので、Format()は使用できません)

既存のデータに対してこれを実行しました。したがって、この方法では、1または987654321は、10個のスペースすべてを先頭に0で埋めます。

新しいデータがインポートされ、Accessデータベースを介してテーブルにダンプされるため、AccessからSQLサーバーテーブルに新しいレコードを追加するときにFormat([Field]、 "0000000000")を使用できます。


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

-'RTRIM'がない場合、返される値は3__!!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

-'RTRIM'がない場合、返される値は867___!!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

0

を使用することRIGHTは適切なオプションですが、次のことも実行できます。

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

どこNあなたがしたい桁数の合計が表示されます。したがって、先行ゼロ(N = 3)を含む3桁の値の場合:

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

または代わりに

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

これが行っていることは、十分なリーディングゼロを生成するのに十分な大きさの10の累乗に目的の値を追加し、リーディング1を切り落とすことです。

この手法の利点は、結果が常に同じ長さになるため、のSUBSTRING代わりにを使用できることですRIGHT。これは、一部のクエリ言語(HQLなど)では使用できません。


0

MYSQLでの私のためのこの作業:

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

例えば:

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

これがお役に立てば幸いです。宜しくお願いします


0

SQLServerで動作します

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

楽しい


-2

私はこれがあなたにとってどんな役に立つのだろうかと思っていました。

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.