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
*/
------------