آموزش کامل تابع SUBSTRING در SQL Server: استخراج و دستکاری رشتهها
تابع `SUBSTRING` در SQL Server یکی از توابع مهم برای کار با رشتههاست که به شما امکان میدهد بخشی از یک رشته ورودی را استخراج کنید. این تابع برای برنامهنویسان و تحلیلگران داده که با دادههای متنی سروکار دارند، ابزاری بسیار کاربردی است. آشنایی با نحوه عملکرد `SUBSTRING` و ترکیب آن با دیگر توابع، به شما کمک میکند تا به راحتی دادههای متنی را پردازش و از آنها اطلاعات مفید استخراج کنید.
**نحو (Syntax) تابع SUBSTRING در SQL Server**
تابع `SUBSTRING` با سه پارامتر اصلی کار میکند: رشتهای که میخواهید از آن بخشی را استخراج کنید، موقعیت شروع و طول بخشی که قرار است استخراج شود.
SUBSTRING (expression, start, length)
* `expression`: رشتهای است که میخواهید بخشی از آن را استخراج کنید. این میتواند یک ستون، یک متغیر یا یک لیترال رشتهای باشد.
* `start`: عددی است که موقعیت شروع استخراج را مشخص میکند. اولین کاراکتر رشته در موقعیت 1 قرار دارد.
* `length`: عددی است که تعداد کاراکترهایی را مشخص میکند که باید از موقعیت `start` استخراج شوند.
اگر `start` یا `length` منفی باشد، خطا رخ میدهد. اگر `start` بیشتر از طول رشته باشد، `SUBSTRING` یک رشته خالی برمیگرداند. اگر جمع `start` و `length` از طول رشته فراتر رود، `SUBSTRING` تمام کاراکترهای باقیمانده از `start` تا انتهای رشته را برمیگرداند.
**مثالهای کاربردی تابع SUBSTRING در SQL Server**
در ادامه، با مثالهای متنوعی نحوه استفاده از تابع `SUBSTRING` را به همراه ترکیب آن با دیگر توابع T-SQL بررسی میکنیم.
استفاده پایه از تابع SUBSTRING
برای استخراج ساده یک بخش مشخص از یک رشته، میتوانید موقعیت شروع و طول مورد نظر را مستقیماً به تابع بدهید.
SELECT SUBSTRING('SQL Server SUBSTRING Examples', 11, 9);
-- نتیجه: SUBSTRING
در این مثال، از کاراکتر یازدهم به بعد، ۹ کاراکتر استخراج شده است.
استفاده از SUBSTRING با CHARINDEX
تابع `CHARINDEX` موقعیت اولین رخداد یک زیررشته را در یک رشته دیگر پیدا میکند. ترکیب آن با `SUBSTRING` برای استخراج دادههای بین جداکنندهها بسیار مفید است.
برای استخراج نام خانوادگی از یک رشته “نام و نام خانوادگی”:
DECLARE @FullName VARCHAR(50) = 'John Doe';
SELECT SUBSTRING(@FullName, CHARINDEX(' ', @FullName) + 1, LEN(@FullName) - CHARINDEX(' ', @FullName));
-- نتیجه: Doe
این کد ابتدا موقعیت اولین فاصله را پیدا میکند، سپس از کاراکتر بعد از فاصله تا انتهای رشته را استخراج میکند.
استفاده از SUBSTRING با PATINDEX
`PATINDEX` مانند `CHARINDEX` است، با این تفاوت که به جای یک زیررشته ثابت، الگوهای وایلدکارد (wildcard patterns) را پشتیبانی میکند.
برای استخراج بخشی از یک رشته که حاوی عدد است:
DECLARE @ProductCode VARCHAR(50) = 'Product-12345-SKU';
SELECT SUBSTRING(@ProductCode, PATINDEX('%-[0-9]%-[A-Z]%', @ProductCode) + 1, 5);
-- نتیجه: 12345
این مثال کمی پیچیده است، زیرا `PATINDEX` اولین موقعیت تطابق الگو را برمیگرداند. در اینجا، یک الگوی شامل اعداد بین دو خط تیره را جستجو میکند.
استفاده از SUBSTRING با مقادیر پویا
میتوانید `start` و `length` را از طریق متغیرها یا توابع دیگر به صورت پویا تعیین کنید.
DECLARE @OriginalString VARCHAR(100) = 'SQL Server is powerful';
DECLARE @StartPos INT = 5;
DECLARE @Len INT = 6;
SELECT SUBSTRING(@OriginalString, @StartPos, @Len);
-- نتیجه: Server
این روش انعطافپذیری زیادی در سناریوهای مختلف فراهم میکند.
عدم پشتیبانی از مقادیر منفی در SUBSTRING
برخلاف برخی از سیستمهای پایگاه داده، `SUBSTRING` در SQL Server از مقادیر منفی برای `start` یا `length` پشتیبانی نمیکند. تلاش برای استفاده از آنها منجر به خطا میشود. برای استخراج از انتهای رشته، باید از توابعی مانند `LEN` یا `RIGHT` استفاده کنید.
برای مثال، استخراج ۳ کاراکتر آخر:
SELECT RIGHT('SQL Server', 3);
-- نتیجه: ver
و برای استخراج ۳ کاراکتر اول:
SELECT LEFT('SQL Server', 3);
-- نتیجه: SQL
استفاده از SUBSTRING در ترکیب با عبارات پنجرهای (Window Functions)
تابع `SUBSTRING` اغلب در عبارات `SELECT` که از توابع پنجرهای مانند `ROW_NUMBER()` یا `RANK()` استفاده میکنند، برای استخراج دادههای گروه بندی شده به کار میرود. این برای سناریوهایی که نیاز به پردازش زیرمجموعههایی از دادهها بر اساس برخی معیارها دارید، بسیار مفید است.
CREATE TABLE #Employees (
EmployeeID INT,
FullName VARCHAR(100),
Department VARCHAR(50)
);
INSERT INTO #Employees (EmployeeID, FullName, Department) VALUES
(1, 'Alice Smith', 'Sales'),
(2, 'Bob Johnson', 'Marketing'),
(3, 'Charlie Brown', 'Sales'),
(4, 'Diana Prince', 'HR'),
(5, 'Eve Adams', 'Marketing');
SELECT
EmployeeID,
FullName,
Department,
SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) AS FirstName,
ROW_NUMBER() OVER (PARTITION BY Department ORDER BY EmployeeID) AS DeptRowNumber
FROM #Employees;
DROP TABLE #Employees;
در این مثال، `SUBSTRING` برای استخراج نام کوچک هر کارمند استفاده شده است، در حالی که `ROW_NUMBER()` به ما یک شماره ردیف بر اساس هر دپارتمان میدهد.
SUBSTRING با LEN و MAX
میتوانید `SUBSTRING` را با `LEN` (برای گرفتن طول رشته) و یا `MAX` (برای یافتن حداکثر مقدار) ترکیب کنید.
برای مثال، استخراج آخرین ۱۰ کاراکتر از طول یک ستون با حداکثر طول:
SELECT SUBSTRING(YourColumn, LEN(YourColumn) - 9, 10) AS LastTenChars
FROM YourTable
WHERE LEN(YourColumn) >= 10;
این کد ۱۰ کاراکتر آخر را از ستونی با طول حداقل ۱۰ استخراج میکند.
معکوس کردن یک رشته با SUBSTRING (با کمک REVERSE)
`SUBSTRING` به تنهایی رشته را معکوس نمیکند، اما میتوانید آن را با تابع `REVERSE` ترکیب کنید تا به نتایج جالبی برسید.
مثلاً برای گرفتن N کاراکتر اول یک رشته پس از معکوس شدن:
SELECT SUBSTRING(REVERSE('SQL Server'), 1, 3);
-- نتیجه: rev
این مثال سه کاراکتر اول رشته “SQL Server” را پس از معکوس شدن (یعنی “rev reS LQS”) استخراج میکند که نتیجه “rev” است.
استفاده از SUBSTRING برای تاریخها
میتوانید از `SUBSTRING` برای استخراج بخشهایی از یک رشته تاریخ استفاده کنید، اگرچه توابع مخصوص تاریخ و زمان مانند `FORMAT` یا `DATEPART` معمولاً توصیه میشوند.
DECLARE @DateString VARCHAR(10) = '2023-10-26';
SELECT
SUBSTRING(@DateString, 1, 4) AS YearPart,
SUBSTRING(@DateString, 6, 2) AS MonthPart,
SUBSTRING(@DateString, 9, 2) AS DayPart;
-- نتایج: YearPart: 2023, MonthPart: 10, DayPart: 26
SUBSTRING با REPLACE
`SUBSTRING` را میتوان با `REPLACE` ترکیب کرد تا بخشهایی از یک رشته را شناسایی کرده و سپس جایگزین کنید.
برای مثال، جایگزینی بخشی از یک URL:
DECLARE @URL VARCHAR(100) = 'https://www.example.com/products/item123';
SELECT REPLACE(@URL, SUBSTRING(@URL, CHARINDEX('/products/', @URL), 9), '/items/');
-- نتیجه: https://www.example.com/items/item123
این کد ابتدا `’/products/’` را پیدا و استخراج میکند، سپس آن را با `’/items/’` جایگزین میکند.
SUBSTRING با CASE Statement
میتوانید `SUBSTRING` را درون یک عبارت `CASE` استفاده کنید تا بر اساس شرایط خاص، بخشهای متفاوتی از یک رشته را استخراج کنید.
DECLARE @ProductCode2 VARCHAR(50) = 'PROD-A-123';
SELECT
CASE
WHEN @ProductCode2 LIKE 'PROD-A-%' THEN SUBSTRING(@ProductCode2, 7, LEN(@ProductCode2) - 6)
WHEN @ProductCode2 LIKE 'SERVICE-B-%' THEN SUBSTRING(@ProductCode2, 10, LEN(@ProductCode2) - 9)
ELSE 'Unknown'
END AS ExtractedPart;
-- نتیجه: 123
این مثال بر اساس الگوی کد محصول، بخش متفاوتی از آن را استخراج میکند.
**ملاحظات عملکردی (Performance Considerations)**
در حالی که `SUBSTRING` یک تابع قدرتمند است، استفاده زیاد از آن (به خصوص در عبارات `WHERE` یا `JOIN`) بر روی ستونهای بزرگ و بدون ایندکس مناسب میتواند بر عملکرد کوئری تأثیر بگذارد.
* **ایندکسها:** توابع رشتهای بر روی ستونها میتوانند باعث شوند ایندکسها استفاده نشوند، که منجر به اسکن کامل جدول میشود.
* **پایداری:** سعی کنید عملیات `SUBSTRING` را تا حد امکان روی دادههای از پیش پردازش شده یا در مرحله انتخاب نهایی انجام دهید، نه در فیلترها.
* **استفاده از توابع جایگزین:** برای عملیات ساده مانند گرفتن کاراکترهای اول یا آخر، از `LEFT` و `RIGHT` استفاده کنید که اغلب خواناتر و گاهی اوقات کمی کارآمدتر هستند.
با درک عمیق از `SUBSTRING` و ترکیب آن با توابع دیگر، میتوانید به طور موثرتری دادههای متنی را در SQL Server مدیریت و تحلیل کنید.