Câu trả lời:
Tôi tin rằng đây có thể là những gì bạn đang tìm kiếm:
SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0')
FROM tableA
hoặc là
SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]
FROM tableA
Tôi chưa thử nghiệm cú pháp trong ví dụ thứ 2. Tôi không chắc liệu điều đó có hoạt động 100% hay không - nó có thể yêu cầu một số điều chỉnh - nhưng nó truyền đạt ý tưởng chung về cách có được đầu ra mong muốn của bạn.
BIÊN TẬP
Để giải quyết các mối quan tâm được liệt kê trong các bình luận ...
@ pkr298 - Có STR chỉ hoạt động trên các số ... Trường của OP là ID ... do đó chỉ là số.
@Desolator - Tất nhiên điều đó sẽ không hoạt động ... tham số Đầu tiên dài 6 ký tự. Bạn có thể làm điều gì đó như:
SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA
điều này về mặt lý thuyết sẽ di chuyển các bài đăng mục tiêu ... khi con số lớn hơn, nó sẽ LUÔN hoạt động .... bất kể là 1 hay 123456789 ...
Vì vậy, nếu giá trị tối đa của bạn là 123456 ... bạn sẽ thấy 0000123456 và nếu giá trị tối thiểu của bạn là 1, bạn sẽ thấy 0000000001
STR(123456, 4)
sẽ trở lại****
SQL Server hiện hỗ trợ chức năng FORMAT bắt đầu từ phiên bản 2012, vì vậy:
SELECT FORMAT(id, '0000') FROM TableA
sẽ thực hiện thủ thuật.
Nếu id hoặc cột của bạn ở dạng a varchar
và đại diện cho một số bạn chuyển đổi đầu tiên:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)
select right('0000'+convert(varchar(4), id), 4)
from @T
Kết quả
----
0001
0002
0012
0123
1234
Bài cũ, nhưng có thể điều này sẽ giúp ai đó:
Để hoàn thành cho đến khi nó kết thúc với 4 ký tự không trống:
SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;
Để hoàn thành cho đến 10:
SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;
Trong trường hợp cột là số , hãy chuyển đổi nó thành varchar trước với mã như vậy:
Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME
Và để hoàn thành cho đến 10 với một trường số:
SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;
- Hãy xem xét những điều này.
select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');
- Tôi hy vọng những điều này sẽ giúp bạn
Điều này hoạt động đối với chuỗi, số nguyên và số:
SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)
4
Chiều dài mong muốn ở đâu . Hoạt động với các số có hơn 4 chữ số, trả về chuỗi trống trên NULL
giá trị.
Nếu ai đó vẫn quan tâm, tôi đã tìm thấy bài viết này trên DATABASE.GUIDE:
Left Padding trong SQL Server - 3 LPAD () Tương đương
Tóm lại, có 3 phương pháp được đề cập trong bài viết đó.
Giả sử id của bạn = 12 và bạn cần nó hiển thị là 0012.
Phương pháp 1 - Sử dụng hàm RIGHT ()
Phương pháp đầu tiên sử dụng hàm RIGHT () để chỉ trả về phần ngoài cùng bên phải của chuỗi, sau khi thêm một số số 0 ở đầu.
SELECT RIGHT('00' + '12', 4);
Kết quả:
0012
Phương pháp 2 - Sử dụng sự kết hợp của RIGHT () và REPLICATE ()
Phương thức này gần giống như phương pháp trước đó, với sự khác biệt duy nhất là tôi chỉ cần thay thế ba số không bằng hàm REPLICATE ():
SELECT RIGHT(REPLICATE('0', 2) + '12', 4);
Kết quả:
0012
Phương pháp 3 - Sử dụng kết hợp REPLACE () và STR ()
Phương pháp này xuất phát từ một góc độ hoàn toàn khác với các phương pháp trước đó:
SELECT REPLACE(STR('12', 4),' ','0');
Kết quả:
0012
Kiểm tra bài viết, có phân tích sâu hơn với các ví dụ.
Tôi cần điều này trong một hàm trên máy chủ SQL và đã điều chỉnh câu trả lời của Patrick một chút.
declare @dossierId int = 123
declare @padded_id varchar(7)
set @padded_id = REPLACE(
SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId),
SPACE(1),
'0')
SELECT @dossierId as '@dossierId'
,SPACE(LEN(@dossierId)) + convert(varchar(7)
,@dossierId) as withSpaces
,@padded_id as '@padded_id'
Tạo chức năng:
Create FUNCTION [dbo].[PadLeft]
(
@Text NVARCHAR(MAX) ,
@Replace NVARCHAR(MAX) ,
@Len INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @var NVARCHAR(MAX)
SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')
RETURN RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)
END
Thí dụ:
Select dbo.PadLeft('123456','0',8)
SELECT @var = LTRIM(RTRIM(@Text))
Tôi đã tạo một hàm:
CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255)
AS
BEGIN
DECLARE @strInt varchar(255)
SET @strInt = CAST(@int as varchar(255))
RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;
Sử dụng: chọn dbo.fnPadLeft (123, 10)
Trả về: 0000000123
Một cái gì đó tương đối tuân thủ ODBC nếu cần có thể như sau:
select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
+ cast (FIELD as varchar(10))
from TABLE_NAME
Điều này dựa trên thực tế là số lượng chữ số của một số cơ số 10 có thể được tìm thấy bằng thành phần tích phân của nhật ký của nó. Từ đó chúng ta có thể trừ nó khỏi chiều rộng đệm mong muốn. Lặp lại sẽ trả về null
các giá trị dưới 1 vì vậy chúng ta cần ifnull
.
Giải pháp của tôi không hiệu quả nhưng đã giúp tôi trong trường hợp các giá trị (số séc ngân hàng và số tham chiếu chuyển khoản ngân hàng) được lưu trữ dưới dạng varchar trong đó một số mục nhập có giá trị số alpha và tôi phải đệm nếu độ dài nhỏ hơn 6 ký tự.
Suy nghĩ để chia sẻ nếu ai đó gặp phải tình huống tương tự
declare @minlen int = 6
declare @str varchar(20)
set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123
set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234
set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789
Một ví dụ đơn giản sẽ là
DECLARE @number INTEGER
DECLARE @length INTEGER
DECLARE @char NVARCHAR(10)
SET @number = 1
SET @length = 5
SET @char = '0'
SELECT FORMAT(@number, replicate(@char, @length))
Tôi đã tạo một hàm để thực hiện việc này, nơi bạn có thể chỉ định độ dài ký tự đầu ra mong muốn:
CREATE FUNCTION [dbo].[udfLeadingZero]
(
@String VARCHAR(MAX)
, @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO