Pad радок з вядучымі нулямі, дык гэта 3 знакаў у SQL Server 2008

У мяне ёсць радок, якая да 3-х знакаў, калі ён першы, створаных у SQL Server 2008 R2.

Я хацеў бы падушачку яго з вядучымі нулямі, таму, калі яго першапачатковае значэнне было «1», то новае значэнне будзе «001». Або, калi яе першапачатковае значэнне было «23» новае значэнне «023». Або, калi яе першапачатковае значэнне «124», то новае значэнне такое ж, як зыходнае значэнне.

Я выкарыстоўваю SQL Server 2008 R2. Як бы я зрабіць гэта з дапамогай T-SQL?

265

13 адказы

Калі поле ўжо радок, гэта будзе працаваць

 SELECT RIGHT('000'+ISNULL(field,''),3)

Калі вы хочаце обнуляет, каб паказаць, як «000»

Гэта можа быць цэлы лік - тады вы хацелі б

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
490
дададзена
@LarryB - MySql гэта адзін з найменш стандарту вялікіх платформаў. Але гэты адказ не гэтак агульным, як гэта можа быць - ISNULL павінен быць COALESCE, напрыклад.
дададзена аўтар Hogan, крыніца
@diraria - LPAD функцыя ў MySQL, гэта пытанне аб SQLServer
дададзена аўтар Hogan, крыніца
@GiannisParaskevopoulos - або нумар захоўваецца ў БД пракладзены справа з сімваламі
дададзена аўтар Hogan, крыніца
О, я разумею, вы мелі прасторы справа ад шэрагу закадаванай у выглядзе радка.
дададзена аўтар Hogan, крыніца
@DWiener - Так, калі вы хочаце больш доўгую радок, то вам трэба, што многія 0 сімвалы, перш чым рабіць абліцоўванне
дададзена аўтар Hogan, крыніца
@dwiener вы атрымалі гэта паводзіны, так як сімвал ўяўляе сабой тып дадзеных фіксаванай даўжыні, так што ў вашым выпадку гольца (6) азначае, даўжынёй 6 знакаў. Калі фактычнае значэнне менш, чым 6 яна дапаўняецца прабеламі справа, так што прапанаваны адказ будзе вырабляць incorect выніку для гольца (6).
дададзена аўтар Giannis Paraskevopoulos, крыніца
калі ласка, дадайце інфармацыю пра LPAD ў YOUT адказ
дададзена аўтар diraria, крыніца
@Hogan, так, але гэтае пытанне top1 вынік Google для «SQL дадаць вядучыя нулі», таму я думаю, што было б карысна для многіх людзей (якія не выкарыстоўваюць SQLServer, але Google на гэтае пытанне), каб ведаць, што ў іншых базах дадзеных могуць існуе больш Convient функцыя LPAD. Дзякуй ў любым выпадку.
дададзена аўтар diraria, крыніца
Hogan да я атрымаў, але незалежна ад таго, як доўга радкі гэта не спрацавала, я трохі занадта заняты, каб высветліць, чаму, але сутнасць яго ў тым, што з майго CHAR (6) поле проста рабіць RIGHT ( '000000 '+ ISNULL (поле,' '), 6) не працуе, а RIGHT (RTRIM (' 000000 '+ ISNULL (поле,' ')), 6) зрабіў.
дададзена аўтар DWiener, крыніца
Я меў (6) поле Чар, які меў некалькі значэнняў, якія былі толькі 2-3 знакаў у даўжыню і вышэй не працуе для мяне. Я павінен быў дадаць RTRIM вакол «000000» + IsNull (поле, «») для таго, каб працаваць.
дададзена аўтар DWiener, крыніца
Хоган, @diraria сапраўды ёсць кропка, але diraria, я лічу, што вы павінны дадаць адказ. Адказ Хогана з'яўляецца ідэальным. Не дакранайцеся да яго. :) Пацешна, Hogan рэдагаваў тэг ў пытанні ўключыць SQL, які чаму гэта # 1 для «SQL вядучых нулёў» пошук, але гэта не той выпадак, калі вы будзеце шукаць «MySQL вядучыя нулі» ...
дададзена аўтар Larry B, крыніца

Хоць пытанне было для SQL Server 2008 R2, у выпадку, калі хтосьці чытае гэта з версіі 2012 і вышэй, з тых часоў яна стала нашмат прасцей за кошт выкарыстання FORMAT .

Вы можаце альбо перадаць стандартнай лікавы радкі фармату або карыстацкі лікавы фармат радок як фармат аргумент (дзякуй Вадзім Аўчыннікаў для гэтага намёку).

Для гэтага пытання, напрыклад, код, як

DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

выхады

001
001
82
дададзена
Што адбудзецца, калі уведзенае лік 111 ці 11?
дададзена аўтар Hogan, крыніца
Вы можаце выкарыстоўваць «D3» замест '00 # ».
дададзена аўтар Vadim Ovchinnikov, крыніца
Для 1 гэта 001, для 11 гэта 011 і 111 гэта 111
дададзена аўтар Géza, крыніца
Дзякуй за падказку, Вадзім, я дадаў яго да майго адказу.
дададзена аўтар Géza, крыніца

<�Моцны> Бяспечны спосаб:

SELECT REPLACE(STR(n,3),' ','0')

This has the advantage of returning the string '***' for n < 0 or n > 999, which is a nice and obvious indicator of out-of-bounds input. The other methods listed here will fail silently by truncating the input to a 3-character substring.

55
дададзена
Блін, хто прызямляецца на гэтай старонцы, павінны дапамагчы гэтаму паплаўка да вяршыні!
дададзена аўтар MarioDS, крыніца
Блін ... Які трук
дададзена аўтар Veloceo, крыніца

Вось больш агульны метад для левай пракладкі да любой жаданай шырыні:

declare @x     int     = 123 -- value to be padded
declare @width int     = 25  -- desired width
declare @pad   char(1) = '0' -- pad character

select right_justified = replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           )
                       + convert(varchar(100),@x)

Аднак, калі вы маеце справу з адмоўнымі значэннямі і дапаўненні з вядучымі нулямі, ні гэта, ні іншы прапанаваны метад будзе працаваць. Вы атрымаеце тое, што выглядае наступным чынам:

00-123

[Магчыма, не тое, што вы хацелі]

So … you'll have to jump through some additional hoops Here's one approach that will properly format negative numbers:

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- source string (converted from numeric value)
         case when @x < 0 then 2 else 1 end ,                 -- insert position
         0 ,                                                  -- count of characters to remove from source string
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
         )

Варта адзначыць, што канвертаваць() выклікі павінны паказаць [п] VARCHAR дастатковай даўжыні, каб трымаць ператвораны вынік з ўсечаным.

26
дададзена
:) яшчэ тады, калі што 3 раніцы выклік прыходзіць я б шмат, а трэба чытаць 1 простую лінію, чым 10 складаных. Даданне зменных далей робіць рэчы горш, асабліва калі іншы член каманды вырашыў вылічыць іх на лета і ня праверыць неадмоўнага @width ...
дададзена аўтар Sten Petrov, крыніца
@StenPetrov, дзякуй. Усё залежыць ад таго, што вы спрабуеце дасягнуць. Адна рэч, якую я навучыўся залежаць у вялікіх рэальных вытворчых баз дадзеных з'яўляецца наяўнасць дрэнных дадзеных таго ці іншага роду. І я аддаю перавагу, каб пазбегнуць 3 AM на тэлефонныя званкі, калі я, магчыма, можа, ^)
дададзена аўтар Nicholas Carey, крыніца
Гэтыя дададзеныя зменныя толькі для абагульнення - вы можаце жорстка закадаваць значэнне. Для аднаго лайнера, вы можаце стварыць скалярнага функцыю - то ў вас ёсць адзін ўкладыш.
дададзена аўтар Gerard ONeill, крыніца

Вось варыянт адказу Хогана, які я выкарыстоўваю ў SQL Server Express 2012:

SELECT RIGHT(CONCAT('000', field), 3)

Замест таго, каб турбавацца, калі поле з'яўляецца радком ці не, я проста CONCAT яго, так як ён будзе выводзіць радок у любым выпадку. Акрамя таго, калі поле можа быць NULL , выкарыстоўваючы ISNULL можа спатрэбіцца, каб пазбегнуць функцыі атрымання NULL вынікі.

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
17
дададзена

Я заўсёды знаходзіў наступны метад, каб быць вельмі карысным.

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
14
дададзена

Выкарыстоўвайце гэтую функцыю, якая падыходзіць любой сітуацыі.

CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @NumStr VARCHAR(250)

    SET @NumStr = LTRIM(@input)

    IF(@pad > LEN(@NumStr))
        SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;

    RETURN @NumStr;
END

прыклад высновы

SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016 
8
дададзена

Для тых, хто хоча абнавіць свае існуючыя дадзеныя тут запыт:

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
4
дададзена

Для цэлых лікаў можна выкарыстоўваць невідавочнае пераўтварэнне з INT ў VARCHAR:

SELECT RIGHT(1000 + field, 3)
3
дададзена
Аднак, што адбудзецца збой пры досыць вялікае значэнне, акрамя таго, для адмоўных значэнняў, вы атрымаеце ... цікавыя вынікі.
дададзена аўтар Nicholas Carey, крыніца

Напісаў гэта, таму што я меў патрабаванне да да пэўнай даўжыні (9). Калодкі злева з @pattern толькі калі ўваход павінен водступы. Заўсёды павінны вяртаць даўжыню, вызначаную ў @pattern.

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @[email protected]) + @charInput, @prefLength)
else
    select @charInput

вяртае 1234input

1
дададзена

У мяне быў аналагічная праблема з цэлалікавых слупком ў якасці ўваходных дадзеных, калі я меў патрэбу памерам VarChar фіксаванага (ці радкі) выхаду. Напрыклад, 1 да '01', 12 '12'. Гэты код працуе:

SELECT RIGHT(CONCAT('00',field::text),2)

Калі ўваход таксама слупок VARCHAR, вы можаце пазбегнуць вымаўлення часткі.

1
дададзена

Просты ў тым, што

як:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
1
дададзена

Я ведаю, што яго стары білет, я проста падумаў, каб падзяліцца.

Я знайшоў гэты код у пошуках рашэння. Не ўпэўнены, што, калі ён працуе на ўсіх версіях MSSQL ў мяне ёсць MSSQL 2016 года.

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

вяртае «0023» 4 у функцыі STR з'яўляецца агульнай даўжынёй уключаючы значэнне. Прыклад 4, 23 і 123 будуць мець 4 у STR і будзе дададзена правільнае колькасць нулёў. Вы можаце павялічыць або паменшыць яго. Няма неабходнасці, каб атрымаць даўжыню на 23.

Змяніць: Я бачу яго так жа, як @Anon пост.

1
дададзена