philzhou

导航

Sql Server为数值变量添加删除前导后缀(翻译)

Execute the following Microsoft SQL Server T-SQL example scripts to demonstrate SQL padding of numbers and strings with leading and trailing zeros as well as with other designated characters, and techniques for removing (trim) leading zeros.

使用以下sql server t-sql 脚本添加删除前导,后缀字符。

-- Add/pad leading zeros to numeric string for a total length of 12 - QUICK SYNTAX

DECLARE @Amount varchar(32) = '78912'

SELECT STUFF(@Amount, 1, 0, REPLICATE('0', 12 - LEN(@Amount))) -- 000000078912

-----STUFF(STR,STRAT_INDEX,REPLACE_CHAR_NUMBER,REPLACE_STR) -------------------
-----STR 目标字符串;START_INDEX: 插入位置(从1开始);
;REPLACE_CHAR_NUMBER: 替换字符数;REPLACE_STR:替换字符串

-- SQL Server leading zero - T-SQL padding numbers - lpad tsql - sql pad zero
-- 从右数取10位字符。

SELECT ListPrice,

Padded=RIGHT('0000000000' + CONVERT(VARCHAR,ListPrice), 10)

FROM AdventureWorks2008.Production.Product WHERE ListPrice > 0.0

------------

-- T SQL pad leading zeros - transact sql leading zeros
-- STR(STR1,Number) 将STR1转换为占Number的字符串,不够的以空白补上左边。

SELECT ProductID, ReorderPoint = REPLACE(STR(ReorderPoint, 6), SPACE(1), '0')

FROM AdventureWorks2008.Production.Product

/* ProductID ReorderPoint

1 000750

2 000750

3 000600
*/

------------

-- SQL Server leading zero - SQL leading zeros - sql server pad leading zero

USE AdventureWorks2008;

DECLARE @Number int = 789

SELECT RIGHT ('000000'+ CAST (@Number AS varchar), 6)

-- 000789

------------

USE AdventureWorks;

-- SQL padding salary pay rate money data type with leading zeroes

-- SQL left pad number - prefix number with zeros - sql server leading zero

-- SQL convert number to text - cast number to varchar string

SELECT EmployeeID,

Rate,

PaddedRate = RIGHT(REPLICATE('0',8) + CAST(Rate AS VARCHAR(8)),8)

FROM HumanResources.EmployeePayHistory
/* Partial results

EmployeeID Rate PaddedRate

1 12.45 00012.45

2 13.4615 00013.46

3 43.2692 00043.27

*/



-- SQL zero padding ListPrice money data type - t sql leading zero

-- SQL left pad - T-SQL string concatenation - sql concat

-- SQL convert number to string - pad numeric with zeros

SELECT ProductID,

ListPrice,

PaddedListPrice = RIGHT(REPLICATE('0', 8) + CAST(ListPrice AS VARCHAR(8)),8)

FROM Production.Product

/* Results sample

ProductID ListPrice PaddedListPrice

965 742.35 00742.35

*/



-- SQL month leading zero - sql pad month number with zero

SELECT RIGHT('0' + convert(varchar(2), month(GetDate())), 2)

-- 06
--
--------

-- trim leading zeros - sql trim leading zeros - remove leading zeros sql
-- patindex('%[^0]%', @num) 取得带通配符的匹配串'%[^0]%'在@num中的匹配位置(从1开始)

USE AdventureWorks2008;

DECLARE @num varchar(32)= '00091234560'

SELECT right(@num, len(@num)+1 - patindex('%[^0]%', @num))

-- 91234560

------------

-- SQL pad numeric data type - SQL pad digits - transact sql leading zeros

-- SQL pad with leading zeroes - append leading zeros - T-SQL top function

-- SQL pad with trailing zeroes - MSSQL append trailing zeros

-- SQL cast money to numeric - cast numeric to string - mssql newid function

SELECT TOP (5)

ProductName = Name,

ListPrice = RIGHT(REPLICATE('0', 10)

+ CAST(CAST(ListPrice AS NUMERIC(9,3)) AS VARCHAR) ,10)

FROM AdventureWorks.Production.Product

ORDER BY NEWID()

/* ProductName ListPrice

LL Mountain Frame - Black, 40 000249.790

HL Touring Frame - Yellow, 46 001003.910

Bike Wash - Dissolver 000007.950

Metal Sheet 7 000000.000

HL Road Frame - Red, 56 001431.500

*/

----------



Technical Job Search: CLICK HERE FOR GREAT JOBS!

-- PAD leading zeros function - sql server leading zeros - UDF

USE AdventureWorks2008;

GO

CREATE FUNCTION fnPadNumber

(@n DECIMAL(26,2),

@length TINYINT)

RETURNS VARCHAR(32)

AS

BEGIN

RETURN ( replicate('0',@length - len(convert(VARCHAR(32),@n))) +

convert(VARCHAR(32),@n))

END

GO



SELECT dbo.fnPadNumber(1234567890.12,16)

-- 0001234567890.12
--
----------

-- T SQL computed column zero padding - sql generate alphanumeric sequence

USE tempdb; -- SQL Server 2008 T-SQL

CREATE TABLE Celebrity (

ID INT IDENTITY ( 1 , 1 ) PRIMARY KEY,

CelebrityID AS 'CEL' + RIGHT('0000' + CAST( ID as varchar),5), -- computed column

FirstName VARCHAR(32),

LastName VARCHAR(32),

ModifiedDate DATE DEFAULT getdate())

GO



INSERT Celebrity

(FirstName,

LastName)

VALUES('Jennifer','Aniston'),

('Drew','Barrymore'),

('Diana','Princess of Wales'),

('Tom','Jones'),

('Lucille','Ball'),

('Frank','Sinatra'),

('Elvis','Presley')



SELECT * FROM Celebrity

GO

-- CelebrityID is zero padded alphanumeric sequence

/*

ID CelebrityID FirstName LastName ModifiedDate

1 CEL00001 Jennifer Aniston 2012-07-04

2 CEL00002 Drew Barrymore 2012-07-04

3 CEL00003 Diana Princess of Wales 2012-07-04

4 CEL00004 Tom Jones 2012-07-04

5 CEL00005 Lucille Ball 2012-07-04

6 CEL00006 Frank Sinatra 2012-07-04

7 CEL00007 Elvis Presley 2012-07-04

*/

-- Cleanup demo

DROP TABLE Celebrity

GO
------------

-- SQL removing leading zeros when no spaces in string - trimming Leading Zeros

USE AdventureWorks2008;

DECLARE @NumberString varchar(16)='000000246'

SELECT REPLACE(LTRIM(REPLACE(@NumberString, '0', ' ')), ' ', '0')

-- 246

------------

-- SQL remove leading zeros - sql trim leading zeros - numeric test

DECLARE @StringWithLeadingZeros VARCHAR(12) = '000000654321'

SELECT CAST(CAST(@StringWithLeadingZeros AS INT) AS VARCHAR(10))

WHERE ISNUMERIC (@StringWithLeadingZeros)=1

-- 654321

------------

-- LPAD & RPAD string scalar-valued user-defined functions (UDF)

USE AdventureWorks;

GO

-- Left pad string function

CREATE FUNCTION LPAD

(@SourceString VARCHAR(MAX),

@FinalLength INT,

@PadChar CHAR(1))

RETURNS VARCHAR(MAX)

AS

BEGIN

RETURN

(SELECT Replicate(@PadChar,@FinalLength - Len(@SourceString)) + @SourceString)

END

GO



-- T-SQL Test left padding

SELECT LeftPaddedString = dbo.LPAD(Cast(84856 AS VARCHAR),12,'0')

GO

-- 000000084856



-- MSSQL right pad string function

CREATE FUNCTION RPAD

(@SourceString VARCHAR(MAX),

@FinalLength INT,

@PadChar CHAR(1))

RETURNS VARCHAR(MAX)

AS

BEGIN

RETURN

(SELECT @SourceString + Replicate(@PadChar,@FinalLength - Len(@SourceString)))

END

GO



-- Test right padding

SELECT RightPaddedString = dbo.RPAD(Cast(84856 AS VARCHAR),12,'*')

GO

-- 84856*******

----------



-- Padding a money column with leading zeroes - sql convert leading zero

-- SQL convert money data type to string

SELECT PaddedUnitPrice = RIGHT(replicate('0',20) +

convert(varchar,UnitPrice,1), 20)

FROM Northwind.dbo.Products

/* Partial results



PaddedUnitPrice

00000000000000018.00

00000000000000019.00

00000000000000010.00

00000000000000022.00

*/



/**************** Zero padding other numeric data ****************/



-- SQL Server 2008 version featuring the LEFT function

-- SQL convert integer to text - convert integer to varchar

USE AdventureWorks2008;

DECLARE @InputNumber int = 522, @OutputLength tinyint = 12

DECLARE @PaddedString char(12)

SET @PaddedString = LEFT( replicate( '0', @OutputLength ),

@OutputLength - len( @InputNumber ) ) + convert( varchar(12), @InputNumber)

SELECT PaddedNumber=@PaddedString

/* Result



PaddedNumber

000000000522

*/





-- SQL format currency and pad with leading spaces

-- SQL Server lpad to 9 characters

SELECT TOP (3) ProductName=Name,

Price= CONVERT(char(9), ListPrice, 1)

FROM Production.Product

WHERE ListPrice > 0.0 ORDER BY Newid()

/*

ProductName Price

LL Touring Frame - Blue, 62 333.42

LL Road Seat Assembly 133.34

Road-250 Red, 58 2,443.35

*/

------------

-- Padding with zeroes in the middle of string

DECLARE @Number varchar(10)

SET @Number = '99999'

PRINT 'TRK' + REPLICATE('0', 12 - LEN(@Number)) + @Number

SELECT [Zero Padding]='TRK' + REPLICATE('0', 12 - LEN(@Number)) + @Number

-- Result: TRK000000099999



-- Applying the STUFF string function for zero padding

-- SQL convert integer data type to string

DECLARE @SerialNo int, @OutputSize tinyint

SET @OutputSize = 10

SET @SerialNo = 6543

SELECT PaddedSerialNo = STUFF(replicate('0', @OutputSize),

@OutputSize - len(@SerialNo)+1, len(@SerialNo), convert(varchar(9),@SerialNo))

-- Result: 0000006543

-- SQL pad integer with 0-s

-- SQL str function - numeric to character conversion

SELECT TOP 5

CAST(replace(str(ProductID,6),' ','0') AS char(6)) AS ProdID

FROM AdventureWorks.Production.Product

ORDER BY Name

/* Results

ProdID

000001

000879

000712

000003

000002

*/



-- SQL pad string with character

-- SQL create function

-- SQL user-defined function

CREATE FUNCTION dbo.fnLeftPadString (

@Input VARCHAR(255),

@PadChar CHAR(1),

@LengthToPad TINYINT

)

RETURNS VARCHAR(255) AS

BEGIN

DECLARE @InputLen TINYINT

SET @InputLen = LEN(@Input)

RETURN

CASE

WHEN @InputLen < @LengthToPad

THEN REPLICATE(@PadChar, @LengthToPad - @InputLen) + @Input

ELSE @Input

END -- CASE

END -- UDF

GO



-- SQL pad string – left padding - SQL left pad with asterisk

-- SQL check printing - SQL currency formatting

DECLARE @DollarAmount varchar(20)

SET @DollarAmount = '234.40'

SELECT PaddedString='$'+dbo.fnLeftPadString(@DollarAmount, '*', 10)

GO

-- Result: $****234.40



-- SQL currency formatting with asterisk-fill

DECLARE @Amount MONEY

SET @Amount = '3534.40'

SELECT CurrencyFormat = '$' + REPLACE(Convert(char(12),@Amount,1),' ','*')

-- $****3,534.40

SELECT PaddedProductID =

dbo.fnLeftPadString (CONVERT(varchar, ProductID), '0', 6),

ProductName=Name,

ListPrice

FROM Production.Product

ORDER BY PaddedProductID

GO



/* Partial results



PaddedProductID ProductName ListPrice

000757 Road-450 Red, 48 1457.99

000758 Road-450 Red, 52 1457.99

000759 Road-650 Red, 58 782.99

000760 Road-650 Red, 60 782.99

000761 Road-650 Red, 62 782.99

*/

----------

-- Generating tracking numbers

-- SQL pad zeroes

WITH cteSequence(SeqNo)

AS (SELECT 1

UNION ALL

SELECT SeqNo + 1

FROM cteSequence

WHERE SeqNo < 1000000)

SELECT TOP 100 CAST(('TRK' + REPLICATE('0',

7 - LEN(CAST(SeqNo AS VARCHAR(6)))) +

CAST(SeqNo AS VARCHAR(6))) AS VARCHAR(10)) AS TrackingNo

FROM cteSequence

OPTION (MAXRECURSION 0)

GO

/* Partial results



TrackingNo

TRK0000001

TRK0000002

TRK0000003

TRK0000004

TRK0000005

TRK0000006

TRK0000007

*/

----------

-- SQL server pad

-- SQL str function

-- SQL pad integer

-- SQL left pad

SELECT TOP (4) StaffName=LastName+', '+FirstName,

PaddedEmployeeID = REPLACE(STR(EmployeeID, 6, 0), ' ', '0')

FROM HumanResources.Employee e

INNER JOIN Person.Contact c

ON e.ContactID = c.ContactID

ORDER BY NEWID()

/* Results



StaffName PaddedEmployeeID

Dyck, Shelley 000214

Hines, Michael 000039

Ford, Jeffrey 000015

Caron, Rob 000168

*/



-- SQL asterisk padding

-- SQL pad with asterisk

-- SQL right pad

SELECT TOP ( 2 * 2 )

AddressID

, City+REPLICATE('*', 20-len(City)) AS City

, PostalCode

FROM AdventureWorks.Person.[Address]

WHERE LEN(City) <= 20

ORDER by NEWID()

GO

/*

AddressID City PostalCode

13465 Imperial Beach****** 91932

23217 Corvallis*********** 97330

18548 Milwaukie*********** 97222

24893 Goulburn************ 2580

*/

------------

------------

-- SQL left pad any size string Alpha with any length string Beta

------------

-- SQL user-defined function - UDF - scalar-valued string function

-- T-SQL varchar(max)

USE AdventureWorks2008;

GO

CREATE FUNCTION fnMaxPad

(@SourceString VARCHAR(MAX),

@PaddingString VARCHAR(MAX),

@OutputLength INT)

RETURNS VARCHAR(MAX)

AS

BEGIN

DECLARE @WorkString VARCHAR(MAX) =

ISNULL(REPLICATE(@PaddingString,@OutputLength - len(ISNULL(@SourceString,0))),

'') + @SourceString

RETURN RIGHT(@WorkString, @OutputLength)

END

GO



-- Execute UDF

SELECT TOP ( 5 ) [SQL Padding Demo] =

dbo.fnMaxPad(CONVERT(VARCHAR,FLOOR(ListPrice)),'_/',21)

FROM Production.Product

ORDER BY NEWID()

GO

/* Results



SQL Padding Demo

_/_/_/_/_/_/_/2443.00

/_/_/_/_/_/_/_/_/0.00

/_/_/_/_/_/_/_/147.00

/_/_/_/_/_/_/_/_/0.00

_/_/_/_/_/_/_/1003.00

*/

------------

-- SQL left pad unicode string Alpha with any length unicode string Beta

-- MSSQL pad international

-- SQL user-defined function - UDF - scalar-value function

-- T-SQL nvarchar(max)

USE AdventureWorks2008;

GO

CREATE FUNCTION fnMaxPadInternational

(@SourceString NVARCHAR(MAX),

@PaddingString NVARCHAR(MAX),

@OutputLength INT)

RETURNS NVARCHAR(MAX)

AS

BEGIN

DECLARE @WorkString NVARCHAR(MAX) =

ISNULL(REPLICATE(@PaddingString,@OutputLength - len(ISNULL(@SourceString,0))),

'') + @SourceString



RETURN RIGHT(@WorkString, @OutputLength)

END

GO



-- Execute UDF

SELECT TOP ( 5 ) [SQL Padding Demo] =

dbo.fnMaxPadInternational(LEFT(Description,6),'_/',21)

FROM Production.ProductDescription

ORDER BY NEWID()

GO

/* Results



SQL Padding Demo

/_/_/_/_/_/_/_/ล้อที่

/_/_/_/_/_/_/_/Roue d

/_/_/_/_/_/_/_/شوكة ط

/_/_/_/_/_/_/_/Each f

/_/_/_/_/_/_/_/Jeu de

*/

------------



posted on 2011-09-29 10:11  philzhou  阅读(973)  评论(0编辑  收藏  举报