วิธีการแปลง int เป็น char ด้วยศูนย์นำหน้า?


99

ฉันต้องการแปลงข้อมูล 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

ตัวอย่าง:

เลือก dbo.CIntToChar (867, 6) เป็น COD_ID

เอาท์พุท

000867


1
ในแคสต์ตัวอย่างแรกของคุณควรเป็น NVARCHAR แทนที่จะเป็นประเภท NCHAR เนื่องจาก NCHAR (3) มีความยาว 3 เสมอ
nzeemin

คำตอบ:


100

ลองสิ่งนี้: 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

58

นอกจากนี้คุณยังสามารถใช้รูปแบบ ()ฟังก์ชั่นการแนะนำในSQL Server 2012 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 - มันช้าเหมือน "หนึ่งหมายเลขต่อหลายวินาที" ช้า อยู่ห่าง ๆ.
Muposat

@Muposat โปรดระบุรหัสสำหรับการทดสอบนั้นได้หรือไม่? มันเป็นสิ่งสำคัญมาก. ขอบคุณล่วงหน้า.
Diomedes Domínguez

3
@Diomedes Domínguezเป็นเวลาหนึ่งปีแล้วดังนั้นฉันจึงไม่มีแบบทดสอบเดิมอีกต่อไป ฉันเพิ่งทำการทดสอบอีกครั้งบนเซิร์ฟเวอร์ที่เร็วมากและมีเวลา 32 วินาทีในการจัดรูปแบบตัวเลข 1 ล้านหมายเลข ไม่ใช่จุดจบของโลก แต่วิธีแก้ปัญหาที่โพสต์โดย Nguyen Tran ทำได้ใน 1 วินาที หากต้องการทดสอบเพียงแค่สร้างลูปจาก @i int = 0 ถึง 10000000
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

ไม่ใช่สำหรับ High-Jack คำถามนี้ แต่จำเป็นต้องมีหมายเหตุว่าคุณต้องใช้ (N) VARCHAR แทน (N) CHAR data-type

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 ฉันไม่สามารถรับคำตอบข้างต้นในการทำงาน
Nathan M.

2
ฉันชอบมันเหมือนกัน. หากความยาวเป็นฮาร์ดโค้ดคุณสามารถใช้RIGHT(1000+Number, 3)- ดีสั้นและเร็ว
maf-soft

1
สิ่งนี้ใช้ได้กับตัวแปร SQL Server ทั้งหมดตั้งแต่ปี 2548 เป็นต้นไป คำตอบที่ต้องการ
Fandango68

1
10 ค่าเฉลี่ยคืออะไร?
Fandango68

1
@ Fandango68 '10' ใน 'POWER (10, @Length)' ด้านบนเป็นเพราะเราใช้เลขคณิตฐาน 10 - ดังนั้นตัวอักษร '1000' ในคำตอบ maf-soft ด้านบนจึงเทียบเท่ากับ POWER (10, 3) - 10 ^ 3 = 1000
qxotk

4

ประเภทข้อมูล "int" ต้องมีจำนวนไม่เกิน 10 หลักนอกจากนี้ฟังก์ชัน "Len ()" ยังทำงานบน ints ได้ดังนั้นจึงไม่จำเป็นต้องแปลง int เป็นสตริงก่อนที่จะเรียกใช้ฟังก์ชัน len ()

สุดท้ายนี้คุณไม่ได้คำนึงถึงกรณีที่ขนาดของ 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

โซลูชันหนึ่งบรรทัด ( ต่อ se ) สำหรับ SQL Server 2008 ขึ้นไป:

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

ฉันพบบทความดีๆที่นี่ :

เติมสตริงที่มีศูนย์นำหน้า

ฉันต้องทำหลายครั้งเมื่อส่งออกข้อมูลความยาวคงที่ตัวอย่างเช่นคอลัมน์ตัวเลขมีความยาว 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)

BTW ถ้าเป็นคอลัมน์ int ก็จะยังคงไม่เก็บค่าศูนย์เพียงแค่ทำในเลเยอร์การนำเสนอหรือถ้าคุณต้องการใน SELECT


1

มีปัญหาเดียวกันนี่คือวิธีที่ฉันแก้ไข ... เรียบง่ายและสง่างาม "4" คือความยาวของสตริงไม่ว่าจะส่งผ่านความยาวของจำนวนเต็มเท่าใดก็ตามก็จะทับด้วยศูนย์จนถึง "4"

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

1

ในกรณีของฉันฉันต้องการให้ฟิลด์ของฉันมี 0 นำหน้าในฟิลด์ 10 อักขระ (NVARCHAR (10)) ซอร์สไฟล์ไม่มี 0 นำหน้าที่จำเป็นในการเข้าร่วมในตารางอื่น สิ่งนี้เกิดจากการใช้ SQL Server 2008R2:

ตั้งค่า Field = right (('0000000000' + [Field]), 10) (ไม่สามารถใช้ Format () ได้เนื่องจากเป็น SQL2012 ก่อนหน้านี้)

ดำเนินการกับข้อมูลที่มีอยู่ ดังนั้นวิธีนี้ 1 หรือ 987654321 จะยังคงเติมช่องว่างทั้ง 10 ช่องด้วย 0 นำหน้า

เนื่องจากข้อมูลใหม่กำลังถูกนำเข้าและจากนั้นถ่ายโอนข้อมูลไปยังตารางผ่านฐานข้อมูล Access ฉันจึงสามารถใช้รูปแบบ ([ฟิลด์], "0000000000") เมื่อต่อท้ายจาก Access ไปยังตารางเซิร์ฟเวอร์ SQL สำหรับระเบียนใหม่ใด ๆ


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เป็นจำนวนตัวเลขที่คุณต้องการแสดง ดังนั้นสำหรับค่า 3 หลักที่มีศูนย์นำหน้า ( N = 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.