آموزش جامع تابع SUBSTRING در SQL Server: برش و استخراج رشتهها
تابع `SUBSTRING` در SQL Server یکی از قدرتمندترین توابع رشتهای است که برای استخراج زیررشتهای از یک رشته یا عبارت مشخص به کار میرود. این تابع به شما امکان میدهد تا بخشی از یک رشته را از یک موقعیت شروع مشخص و با یک طول معین جدا کنید. این قابلیت برای کارهایی مانند پاکسازی دادهها، فرمتبندی، یا تحلیل اطلاعات متنی بسیار مفید است. ساختار کلی تابع `SUBSTRING` به صورت زیر است:
SUBSTRING (expression, start, length)
در این ساختار: * expression: عبارتی از نوع کاراکتر، باینری، `text`، `ntext`، `image`، یا هر نوع دادهای که بتواند به این انواع به صورت ضمنی تبدیل شود. * start: یک عبارت عدد صحیح است که موقعیت شروع زیررشته را مشخص میکند. موقعیت اول در عبارت با عدد 1 شروع میشود. * length: یک عبارت عدد صحیح مثبت است که طول زیررشتهای را که قرار است برگردانده شود، مشخص میکند. خروجی تابع `SUBSTRING` بستگی به نوع ورودی expression دارد. اگر expression یکی از انواع `nvarchar`، `nchar`، `ntext` باشد، خروجی `nvarchar` خواهد بود. اگر expression` از نوع `varbinary`، `varchar`، `char`، `text`، `image` باشد، خروجی `varchar` خواهد بود.
مثال 1: استخراج یک زیررشته ساده با SUBSTRING
این مثال نحوه استفاده از تابع `SUBSTRING` را برای استخراج بخشی از یک رشته مشخص نشان میدهد. در اینجا، میخواهیم عبارت “SQL Server” را از رشته “This is SQL Server Tutorial” جدا کنیم.
SELECT SUBSTRING('This is SQL Server Tutorial', 9, 10) AS ExtractedString;
نتیجه این کوئری “SQL Server” خواهد بود. تابع از موقعیت 9 شروع کرده و 10 کاراکتر را استخراج میکند.
مثال 2: استفاده از SUBSTRING با دادههای جدول
در این مثال، میخواهیم زیررشتهای از ستون `FirstName` در جدول `Person.Person` (از دیتابیس `AdventureWorks`) را استخراج کنیم. ما 3 کاراکتر اول از نام هر شخص را انتخاب میکنیم.
SELECT BusinessEntityID, FirstName, SUBSTRING(FirstName, 1, 3) AS SubstringName
FROM Person.Person;
این کوئری `BusinessEntityID` و `FirstName` کامل و همچنین 3 کاراکتر اول `FirstName` را برای هر رکورد برمیگرداند.
مثال 3: استخراج زیررشته از انتهای یک رشته با SUBSTRING
برای استخراج زیررشته از انتهای یک رشته، میتوانید از تابع `LEN` همراه با `SUBSTRING` استفاده کنید. این مثال 4 کاراکتر آخر از `FirstName` را استخراج میکند.
SELECT BusinessEntityID, FirstName, SUBSTRING(FirstName, LEN(FirstName) - 3, 4) AS SubstringName
FROM Person.Person;
با استفاده از `LEN(FirstName) – 3`، موقعیت شروع را 4 کاراکتر قبل از انتهای رشته محاسبه میکنیم، و سپس 4 کاراکتر را از آن نقطه به بعد استخراج میکنیم.
مثال 4: استخراج بخشهای متغیر از رشته با SUBSTRING و CHARINDEX
این مثال نشان میدهد که چگونه میتوان یک زیررشته با طول متغیر را با استفاده از `SUBSTRING` و `CHARINDEX` استخراج کرد. ما نام دومین را از آدرسهای ایمیل در جدول `Person.EmailAddress` جدا میکنیم.
SELECT EmailAddress,
SUBSTRING(EmailAddress, CHARINDEX('@', EmailAddress) + 1, LEN(EmailAddress) - CHARINDEX('@', EmailAddress)) AS EmailDomain
FROM Person.EmailAddress;
`CHARINDEX(‘@’, EmailAddress)` موقعیت کاراکتر ‘@’ را پیدا میکند. با اضافه کردن 1، از بعد از ‘@’ شروع میکنیم. سپس طول باقیمانده رشته را برای استخراج کامل دومین محاسبه میکنیم.
مثال 5: استفاده از SUBSTRING در شرط WHERE
تابع `SUBSTRING` را میتوان در بند `WHERE` برای فیلتر کردن نتایج بر اساس بخشی از یک رشته به کار برد. در این مثال، ما تمام `FirstName`هایی را انتخاب میکنیم که با “Rob” شروع میشوند.
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
WHERE SUBSTRING(FirstName, 1, 3) = 'Rob';
این کوئری تمام افرادی را برمیگرداند که 3 کاراکتر اول نام آنها “Rob” باشد.
مثال 6: استخراج بخشهایی از تاریخ با SUBSTRING
اگر تاریخها به صورت رشتهای ذخیره شده باشند، `SUBSTRING` میتواند برای استخراج بخشهای سال، ماه یا روز مفید باشد. در این مثال، سال را از یک رشته تاریخ استخراج میکنیم.
SELECT SUBSTRING('2023-10-26', 1, 4) AS YearPart,
SUBSTRING('2023-10-26', 6, 2) AS MonthPart,
SUBSTRING('2023-10-26', 9, 2) AS DayPart;
این کوئری به ترتیب “2023”، “10” و “26” را به عنوان خروجی نمایش میدهد.
مثال 7: استفاده از SUBSTRING برای استخراج اعداد
در مواردی که رشتهها شامل ترکیبی از حروف و اعداد هستند، میتوان از `SUBSTRING` برای جداسازی بخش عددی استفاده کرد، البته معمولاً همراه با توابع دیگر.
SELECT SUBSTRING('Product Code P12345XYZ', 14, 5) AS ProductNumber;
این کوئری “12345” را به عنوان `ProductNumber` برمیگرداند، با فرض اینکه کد محصول همیشه از موقعیت 14 شروع شده و 5 رقم باشد. برای موارد پیچیدهتر، نیاز به منطق دقیقتری با استفاده از `PATINDEX` یا توابع مشابه خواهید داشت.