web-dev-qa-db-ja.com

先頭にゼロを付けてintをcharに変換する方法は?

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

90
RicardoBalda

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

結果は5桁で取得されます(例:00001、....、01234)

86
Nguyen Tran

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')
48
Darek.K

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
21
KM.

この質問をハイジャックするのではなく、(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は、必要なプレフィックス長をオンザフライで提供します。固定長のデータ型では、長さの指定と調整が必要になります。

13
GoldBishop

使用したい

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

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

これは私に与えます

000000004
5
Sedecimdies

データ型 "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
4
C.List

SQL Server 2008以降の1行のソリューション(per se):

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つの引数しか受け入れないことです...

2
Piotr Nawrot

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

例:

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

結果: '000867'

2
Brute Force SQL
    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
Tarun Gupta

私の場合、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")を使用できます。

1
jhimes

良い記事を見つけました こちら

先行ゼロを含む文字列のパディング

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

1
Andrew Hare

同じ問題があった場合、これが私が解決した方法です...シンプルでエレガント。 「4」は、文字列の長さであり、整数の長さに関係なく、「4」までのゼロで埋められます。

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))
1
user2096582
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
John Lonberger

私の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
Tricky Silence

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を切り落とすことです。

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

0
Peter Gluck