Функция PadLeft в T-SQL - PullRequest
       41

Функция PadLeft в T-SQL

103 голосов
/ 04 апреля 2011

У меня есть следующая таблица A:

id
----
1
2
12
123
1234

Мне нужно заполнить значения id слева нулями:

id
----
0001
0002
0012
0123
1234

Как мне этого добиться?

Ответы [ 16 ]

1 голос
/ 11 октября 2016

Создать функцию:

    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

Пример:

Select dbo.PadLeft('123456','0',8)
1 голос
/ 02 октября 2013

Мне нужно было это в функции на сервере SQL и немного скорректировать ответ Патрика.

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'
0 голосов
/ 10 июля 2019

Простой пример будет

    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))
0 голосов
/ 25 октября 2015

Мое решение неэффективно, но помогло мне в ситуации, когда значения (номера банковских чеков и номер банковского перевода) были сохранены как varchar, где некоторые записи имели буквенно-цифровые значения с ними, и мне пришлось дополнять, если длина меньше 6 символов.

Мысль поделиться, если кто-то сталкивается с такой же ситуацией

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
0 голосов
/ 09 июня 2015

При необходимости может быть достаточно ODBC-совместимым:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

Это основано на том факте, что количество цифр для числа base-10 можно найти по интегральной составляющей его журнала. Из этого мы можем вычесть это из желаемой ширины отступа. Повтор будет возвращать null для значений ниже 1, поэтому нам нужно ifnull.

0 голосов
/ 25 января 2015

Более эффективный способ:

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...