خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را
استخراج کردن اعداد از یک رشته در SQL Server
با این فرض که ردیف یا ریدف هایی رشته ای که ترکیبی از اعداد و حروف و کاراکترها هستند را دارید و حال می خواهید که اعداد را از کاربراکترها جدا کنید و فقط اعداد را داشته باشید و این اعداد استخراج شده از سایر کارکترها را با ویرگول از هم جدا کنید. در برخی سناریوهایی که در SQL Server دارید، شاید نیاز به این کار داشته باشید. یعنی اگر یک رشته abc123def456ghi789 وجود داشته باشد ، اعداد باید به صورت 123،456،789 از هم جدا شوند. برای ان منظور از Function زیر می توانید استفاده کنید.
حالا که Function ایجاد شد، با استفاده از اسکریپت های زیر، این مورد را تست می کنیم و خواهید که چگونه اعداد موجود در یک رشته از حروف و کاراکترها، استخراج شده و نمایش داده می شود:
CREATE FUNCTION [dbo].[mtb_GetNumbers]
(
@stInput VARCHAR(max)
)
RETURNS VARCHAR(max)
AS
BEGIN
SET @stInput = REPLACE(@stInput,',','')
DECLARE @intAlpha INT
DECLARE @intNumber INT
SET @intAlpha = PATINDEX('%[^0-9,]%', @stInput)
SET @intNumber = PATINDEX('%[0-9,]%', @stInput)
IF @stInput IS NULL OR @intNumber = 0
RETURN '';
WHILE @intAlpha > 0
BEGIN
IF (@intAlpha > @intNumber)
BEGIN
SET @intNumber = PATINDEX('%[0-9,]%', SUBSTRING(@stInput, @intAlpha, LEN(@stInput)) )
SELECT @intNumber = CASE WHEN @intNumber = 0 THEN LEN(@stInput) ELSE @intNumber END
END
SET @stInput = STUFF(@stInput, @intAlpha, @intNumber - 1,',' );
SET @intAlpha = PATINDEX('%[^0-9,]%', @stInput )
SET @intNumber = PATINDEX('%[0-9,]%', SUBSTRING(@stInput, @intAlpha, LEN(@stInput)) )
SELECT @intNumber = CASE WHEN @intNumber = 0 THEN LEN(@stInput) ELSE @intNumber END
END
IF (RIGHT(@stInput, 1) = ',')
SET @stInput = LEFT(@stInput, LEN(@stInput) - 1)
IF (LEFT(@stInput, 1) = ',')
SET @stInput = RIGHT(@stInput, LEN(@stInput) - 1)
RETURN ISNULL(@stInput,0)
END
GO
حالا که Function ایجاد شد، با استفاده از اسکریپت های زیر، این مورد را تست می کنیم و خواهید که چگونه اعداد موجود در یک رشته از حروف و کاراکترها، استخراج شده و نمایش داده می شود:
/* Testing the function with alpha numeric strings */
SELECT '1a2b3c', dbo.mtb_GetNumbers('1a2b3c');
SELECT '123abc', dbo.mtb_GetNumbers('123abc');
SELECT 'abc123', dbo.mtb_GetNumbers('abc123');
SELECT 'a123b', dbo.mtb_GetNumbers('a123b');
SELECT '1abc2', dbo.mtb_GetNumbers('1abc2');
SELECT '123abc123abc', dbo.mtb_GetNumbers('123abc123abc');
SELECT '', dbo.mtb_GetNumbers('');
SELECT 'NonNumeric', dbo.mtb_GetNumbers('NonNumeric');
SELECT 'NULL', dbo.mtb_GetNumbers(NULL);
SELECT 'Azure4234SQL232Data333Warehouse23and0Parallel,Data43434Warehouse', dbo.mtb_GetNumbers('Azure4234SQL232Data333Warehouse23and0Parallel,Data43434Warehouse');
GO
نمایش دیدگاه ها (0 دیدگاه)
دیدگاه خود را ثبت کنید: