Làm thế nào để chuyển đổi int sang char với các số 0 ở đầu?


98

Tôi cần chuyển đổi int datafield thành nvarchar với các số 0 ở đầu

thí dụ:

1 chuyển đổi thành '001'

867 chuyển đổi thành '000867', v.v.

cám ơn.


Đây là phản hồi của tôi 4 giờ sau ...

Tôi đã thử nghiệm T-SQL Script này và hoạt động tốt đối với tôi!

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ôi đã tạo chức năng người dùng này

Mã 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

Thí dụ :

CHỌN dbo.CIntToChar (867, 6) AS COD_ID

ĐẦU RA

000867


1
Trong mẫu đầu tiên của bạn phôi nên NVARCHAR thay vì loại NCHAR, vì NCHAR (3) luôn chiều dài của 3.
nzeemin

Câu trả lời:


99

Thử cái này: select right('00000' + cast(Your_Field as varchar(5)), 5)

Nó sẽ nhận được kết quả bằng 5 chữ số, ví dụ: 00001, ...., 01234


1
Lưu ý rằng đối postgres bạn sẽ cần phải thay thế + với ||, vì vậyselect right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

56

Bạn cũng có thể sử dụng hàm FORMAT () được giới thiệu trong 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')

Tôi sẽ đồng ý về SQL2012, nhưng đối với những SQL 2008r2 trở lên, giải pháp của tôi sẽ nhận được kết quả
GoldBishop

1
Vừa thử nghiệm FORMAT Sql Server 2012 - nó chậm, như chậm "một số trên vài giây". Tránh ra.
Muposat

@Muposat, bạn có thể vui lòng cung cấp mã cho bài kiểm tra đó không? Nó rất quan trọng. Cảm ơn trước.
Diomedes Domínguez

3
@Diomedes Domínguez đã một năm rồi nên không còn bài test gốc nữa. Tôi vừa chạy một bài kiểm tra khác trên một máy chủ rất nhanh và có 32 giây để định dạng 1 triệu số. Không phải tận thế, nhưng giải pháp do Nguyễn Trần đăng tải lại làm được điều đó trong 1 giây. Để kiểm tra, bạn chỉ cần tạo một vòng lặp từ @i int = 0 đến 10000000.
Muposat

22

Sử dụng REPLICATEđể bạn không phải mã hóa tất cả các số không ở đầu:

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

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

ĐẦU RA:

0000000123

13

Câu hỏi này không phải là High-Jack nhưng cần lưu ý rằng bạn cần sử dụng (N) VARCHAR thay vì (N) CHAR kiểu dữ liệu.

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

Phân đoạn trên, sẽ không tạo ra phản hồi chính xác từ SQL 2005

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

Phân đoạn trên, sẽ tạo ra phản hồi mong muốn từ SQL 2005

Varchar sẽ cung cấp cho bạn độ dài tiền tố mong muốn khi đang di chuyển. Trong đó, kiểu dữ liệu có độ dài cố định sẽ yêu cầu chỉ định và điều chỉnh độ dài.


6

Tôi thích sử dụng

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

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

cái này cho tôi

000000004

1
Cảm thấy hơi khó hiểu, nhưng nó hoạt động với tôi trong DB2. Tôi không thể nhận được các câu trả lời ở trên để làm việc.
Nathan M.

2
Tôi thích nó quá. Nếu chiều dài là hardcoded, bạn chỉ có thể sử dụng RIGHT(1000+Number, 3)- đẹp, ngắn và nhanh chóng
MAF-mềm

1
Điều này hoạt động trên tất cả các biến thể SQL Server từ năm 2005 trở đi. Câu trả lời ưu tiên.
Fandango68,

1
10 nghĩa là gì?
Fandango68

1
@ Fandango68 Chữ '10' trong 'POWER (10, @Length)' ở trên là do chúng ta sử dụng số học cơ số 10 - vì vậy chữ '1000' trong câu trả lời maf-soft ở trên tương đương với POWER (10, 3) - 10 ^ 3 = 1000.
qxotk

4

Kiểu dữ liệu "int" không được nhiều hơn 10 chữ số, ngoài ra, hàm "Len ()" hoạt động trên int, vì vậy không cần chuyển int thành chuỗi trước khi gọi hàm len ().

Cuối cùng, bạn không tính đến trường hợp kích thước int của bạn> tổng số chữ số bạn muốn nó chèn vào (@intLen).

Do đó, một giải pháp ngắn gọn / đúng đắn hơn là:

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

Không thanh lịch lắm, nhưng tôi thêm một giá trị đã đặt có cùng số lượng các số 0 đứng đầu mà tôi mong muốn vào số tôi muốn chuyển đổi và sử dụng hàm RIGHT.

Thí dụ:

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

Kết quả: '000867'


2

Giải pháp một dòng ( mỗi se ) cho SQL Server 2008 trở lên:

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

Phép nhân với SIGNbiểu thức tương đương với MAX(0, @DesiredLenght-LEN([Column])). Vấn đề là MAX()chỉ chấp nhận một đối số ...


1

Tôi tìm thấy một bài báo hay ở đây :

Chèn một chuỗi bằng các số 0 ở đầu

Tôi cần phải làm điều này rất nhiều lần khi xuất ra dữ liệu có độ dài cố định, ví dụ như cột số dài 9 ký tự và bạn cần đặt tiền tố bằng số 0 ở đầu.


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 nếu nó là một cột int thì nó vẫn sẽ không giữ các số không Chỉ cần làm điều đó trong lớp trình bày hoặc nếu bạn thực sự cần trong SELECT


1

Gặp vấn đề tương tự, đây là cách tôi giải quyết ... Đơn giản và thanh lịch. "4" là độ dài của chuỗi, bất kể độ dài của số nguyên nào được truyền đi, nó sẽ chèn bằng 0 lên đến "4".

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

1

Trong trường hợp của tôi, tôi muốn trường của mình có số 0 đứng đầu trong trường 10 ký tự (NVARCHAR (10)). Tệp nguồn không có số 0 đứng đầu cần thiết để sau đó nối với một bảng khác. Điều này chỉ đơn giản là do ở trên SQL Server 2008R2:

Đặt Field = right (('0000000000' + [Field]), 10) (Không thể sử dụng Format () vì đây là phiên bản trước SQL2012)

Thực hiện điều này so với dữ liệu hiện có. Vì vậy, theo cách này 1 hoặc 987654321 vẫn sẽ lấp đầy tất cả 10 chỗ trống với các số 0 đứng đầu.

Vì dữ liệu mới đang được nhập và sau đó được kết xuất vào bảng thông qua cơ sở dữ liệu Access, tôi có thể sử dụng Định dạng ([Trường], "0000000000") khi thêm từ Access vào bảng máy chủ SQL cho bất kỳ bản ghi mới nào.


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- Không có 'RTRIM', giá trị trả về là 3__!!!

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

- Không có 'RTRIM', giá trị trả về là 867___!!!

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

0

Sử dụng RIGHTlà một lựa chọn tốt nhưng bạn cũng có thể làm như sau:

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

đâu Nlà tổng số chữ số bạn muốn hiển thị. Vì vậy, đối với một giá trị có 3 chữ số với các số 0 ở đầu ( N = 3):

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

hoặc luân phiên

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

Điều này đang làm là thêm giá trị mong muốn vào lũy thừa 10 đủ lớn để tạo ra đủ số 0 ở đầu, sau đó cắt bỏ số 1 ở đầu.

Ưu điểm của kỹ thuật này là kết quả sẽ luôn có cùng độ dài, cho phép sử dụng SUBSTRINGthay thế RIGHT, không có sẵn trong một số ngôn ngữ truy vấn (như HQL).


0

Công việc này đối với tôi trong 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

Ví dụ:

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

Hy vọng điều này sẽ giúp ích. Trân trọng


0

Hoạt động trong 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)

Thưởng thức


-2

Tôi đã tự hỏi, điều này sẽ có ích cho bạn?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.