راهنمای جامع دستور IF در SQL Server: شرطها، بلاکها و کاربردهای پیشرفته
دستور **IF در SQL Server** یک عبارت شرطی قدرتمند است که به شما امکان میدهد بلاکهای کد یا دستورات منفرد را تنها در صورتی اجرا کنید که یک شرط خاص صحیح باشد. این دستور در **روالهای ذخیرهشده SQL** (Stored Procedures)، توابع و تریگرها کاربرد فراوان دارد و به شما کمک میکند منطق برنامهنویسی پیچیدهتری را پیادهسازی کنید و **کنترل جریان در SQL** را بهبود بخشید.
ساختار اصلی دستور `IF` شامل یک عبارت بولی (شرط منطقی) است که پس از آن دستور SQL یا یک بلاک دستورات اجرا میشود.
IF Boolean_expression { SQL_statement | statement_block }
در اینجا، `Boolean_expression` شرطی است که باید ارزیابی شود و `SQL_statement` یا `statement_block` کدی است که در صورت درست بودن شرط اجرا میشود.
برای درک بهتر نحوه کار `IF` در SQL Server، یک سناریو را در نظر بگیرید. میخواهیم مقداری را در یک متغیر ذخیره کنیم و سپس بر اساس آن مقدار، پیامی را چاپ کنیم.
DECLARE @MyVariable INT = 10;
IF @MyVariable > 5
PRINT 'MyVariable is greater than 5.';
در این مثال، چون `MyVariable` (10) بزرگتر از 5 است، عبارت `PRINT` اجرا میشود.
#### استفاده از IF همراه با BEGIN و END در SQL Server
هنگامی که نیاز دارید بیش از یک دستور را در بلاک `IF` اجرا کنید، باید از کلمات کلیدی `BEGIN` و `END` استفاده کنید. این ساختار یک **بلاک دستورات SQL** را تعریف میکند که بهطور کامل تحت شرط `IF` اجرا میشود. این قابلیت برای **منطق شرطی پیچیده در SQL** ضروری است.
IF Boolean_expression BEGIN { SQL_statement | statement_block } END
این فرمول نشان میدهد که اگر `Boolean_expression` صحیح باشد، تمام دستورات بین `BEGIN` و `END` اجرا خواهند شد.
مثال زیر نشان میدهد چگونه میتوان چندین دستور را در یک بلاک `IF` با استفاده از `BEGIN` و `END` گروهبندی کرد:
DECLARE @MyVariable INT = 10;
IF @MyVariable > 5
BEGIN
PRINT 'MyVariable is greater than 5.';
PRINT 'This is inside the BEGIN...END block.';
END
در این مورد، هر دو عبارت `PRINT` اجرا میشوند زیرا `MyVariable` بزرگتر از 5 است.
#### دستور IF ELSE در SQL Server
دستور **IF ELSE در SQL Server** به شما امکان میدهد یک مسیر جایگزین برای اجرا تعریف کنید، زمانی که شرط `IF` اولیه نادرست باشد. این ساختار **تصمیمگیری دوطرفه در SQL** را فراهم میکند و به شما اجازه میدهد در هر دو حالت (صحیح یا غلط بودن شرط) واکنش متفاوتی داشته باشید.
IF Boolean_expression { SQL_statement | statement_block } ELSE { SQL_statement | statement_block }
این فرمول نشان میدهد که اگر `Boolean_expression` صحیح باشد، بلاک اول اجرا میشود؛ در غیر این صورت، بلاک دوم (بعد از `ELSE`) اجرا خواهد شد.
برای مثال، اگر `MyVariable` بزرگتر از 5 نباشد، میتوانیم پیام متفاوتی نمایش دهیم:
DECLARE @MyVariable INT = 3;
IF @MyVariable > 5
BEGIN
PRINT 'MyVariable is greater than 5.';
END
ELSE
BEGIN
PRINT 'MyVariable is NOT greater than 5.';
END
در این حالت، چون 3 بزرگتر از 5 نیست، عبارت `PRINT` در بلاک `ELSE` اجرا میشود.
#### دستور IF ELSE IF در SQL Server
برای سناریوهایی که نیاز به بررسی چندین شرط متوالی دارید، **IF ELSE IF در SQL Server** راهحل مناسبی است. این ساختار به شما امکان میدهد چندین شرط را پشت سر هم ارزیابی کنید و به ازای هر شرط، یک بلاک کد متفاوت را اجرا نمایید. این قابلیت برای **شرطبندی چندگانه در SQL** بسیار مفید است.
IF Boolean_expression { SQL_statement | statement_block } ELSE IF Boolean_expression { SQL_statement | statement_block } [ …n ] [ ELSE { SQL_statement | statement_block } ]
این فرمول نشان میدهد که SQL Server شرط اول را ارزیابی میکند، اگر صحیح بود بلاک آن اجرا میشود. در غیر این صورت، به سراغ `ELSE IF` بعدی میرود و این روند تا زمانی که یک شرط صحیح پیدا شود یا به بلاک نهایی `ELSE` (در صورت وجود) برسد، ادامه پیدا میکند.
بیایید مثالی را برای تخصیص درجه به دانشآموزان بر اساس نمره آنها بررسی کنیم:
DECLARE @Score INT = 85;
IF @Score >= 90
PRINT 'Grade: A';
ELSE IF @Score >= 80
PRINT 'Grade: B';
ELSE IF @Score >= 70
PRINT 'Grade: C';
ELSE
PRINT 'Grade: F';
در این مثال، چون نمره 85 است، شرط دوم (`@Score >= 80`) صحیح بوده و “Grade: B” چاپ میشود.
#### دستور IF EXISTS در SQL Server
دستور **IF EXISTS در SQL Server** برای بررسی وجود ردیفها در یک جدول یا نتیجه یک کوئری استفاده میشود. این یک روش کارآمد برای **چک کردن وجود داده در SQL** قبل از انجام عملیات دیگر مانند درج (INSERT)، بهروزرسانی (UPDATE) یا حذف (DELETE) است.
مثالی که وجود یک رکورد خاص را بررسی میکند:
IF EXISTS (SELECT 1 FROM Customers WHERE CustomerID = 1)
PRINT 'Customer with ID 1 exists.';
ELSE
PRINT 'Customer with ID 1 does NOT exist.';
این کوئری ابتدا بررسی میکند که آیا مشتری با `CustomerID` برابر 1 وجود دارد یا خیر. اگر یک ردیف پیدا شود، پیام “Customer with ID 1 exists.” چاپ میشود.
#### دستور IF NOT EXISTS در SQL Server
دستور **IF NOT EXISTS در SQL Server** برای بررسی عدم وجود ردیفها در یک جدول یا نتیجه یک کوئری استفاده میشود. این دستور بهویژه برای **جلوگیری از درج تکراری در SQL** مفید است، جایی که میخواهید مطمئن شوید قبل از درج یک رکورد جدید، آن رکورد از قبل وجود نداشته باشد.
مثالی که عدم وجود یک رکورد خاص را بررسی میکند:
IF NOT EXISTS (SELECT 1 FROM Products WHERE ProductName = 'New Product')
BEGIN
INSERT INTO Products (ProductName, Price) VALUES ('New Product', 25.00);
PRINT 'New Product inserted successfully.';
END
ELSE
BEGIN
PRINT 'Product "New Product" already exists.';
END
در این مورد، اگر محصولی با نام ‘New Product’ در جدول `Products` وجود نداشته باشد، آن را درج کرده و پیام مربوطه را نمایش میدهد.
#### دستور IF IS NULL در SQL Server
دستور **IF IS NULL در SQL Server** برای بررسی اینکه آیا یک ستون یا متغیر حاوی مقدار `NULL` است، به کار میرود. این برای **مدیریت مقادیر NULL در SQL** حیاتی است، زیرا مقادیر `NULL` در SQL معنای “ناشناخته” یا “بدون مقدار” دارند و در مقایسههای معمولی رفتار متفاوتی دارند.
مثال:
DECLARE @Email VARCHAR(100) = NULL;
IF @Email IS NULL
PRINT 'Email is NULL.';
ELSE
PRINT 'Email is NOT NULL.';
در اینجا، چون `Email` با `NULL` مقداردهی شده است، پیام “Email is NULL.” چاپ میشود.
#### دستور IF IS NOT NULL در SQL Server
برعکس `IS NULL`، دستور **IF IS NOT NULL در SQL Server** برای بررسی اینکه آیا یک ستون یا متغیر حاوی مقداری به جز `NULL` است، استفاده میشود. این برای اطمینان از **وجود دادههای معتبر در SQL** قبل از پردازش آنها ضروری است.
مثال:
DECLARE @PhoneNumber VARCHAR(20) = '123-456-7890';
IF @PhoneNumber IS NOT NULL
PRINT 'Phone number is available.';
ELSE
PRINT 'Phone number is NOT available (NULL).';
در این مثال، `PhoneNumber` دارای یک مقدار است، بنابراین “Phone number is available.” چاپ میشود.
#### استفاده از دستور IF با عملگرهای مقایسهای در SQL Server
دستور **IF در SQL Server** به خوبی با انواع **عملگرهای مقایسهای SQL** کار میکند. این عملگرها شامل `=` (مساوی)، “ (نامساوی)، `>` (بزرگتر از)، `=` (بزرگتر یا مساوی)، و `<=` (کوچکتر یا مساوی) هستند.
مثال برای استفاده از عملگرهای مقایسهای:
DECLARE @Value1 INT = 20, @Value2 INT = 15;
IF @Value1 > @Value2
PRINT 'Value1 is greater than Value2.';
IF @Value1 = @Value2
PRINT 'Value1 is equal to Value2.';
IF @Value1 @Value2
PRINT 'Value1 is not equal to Value2.';
در این مثال، تنها شرط اول و سوم صحیح خواهند بود.
#### استفاده از دستور IF با عملگرهای منطقی AND و OR در SQL Server
برای ایجاد **شرایط پیچیدهتر در SQL**، میتوانید از عملگرهای منطقی `AND` و `OR` در عبارت `Boolean_expression` دستور `IF` استفاده کنید.
* **AND**: هر دو شرط باید صحیح باشند تا کل عبارت صحیح شود.
* **OR**: حداقل یکی از شرطها باید صحیح باشد تا کل عبارت صحیح شود.
مثال استفاده از `AND`:
DECLARE @Age INT = 30, @HasLicense BIT = 1; -- 1 for true, 0 for false
IF @Age >= 18 AND @HasLicense = 1
PRINT 'Eligible to drive.';
ELSE
PRINT 'Not eligible to drive.';
در این حالت، چون هر دو شرط (سن بالای 18 و داشتن گواهینامه) صحیح هستند، پیام “Eligible to drive.” نمایش داده میشود.
مثال استفاده از `OR`:
DECLARE @IsAdmin BIT = 0, @IsManager BIT = 1;
IF @IsAdmin = 1 OR @IsManager = 1
PRINT 'User has elevated privileges.';
ELSE
PRINT 'User has standard privileges.';
در اینجا، چون `IsManager` صحیح است، پیام “User has elevated privileges.” چاپ میشود.
#### استفاده از دستور IF با توابع رشتهای در SQL Server
میتوانید از **توابع رشتهای SQL** مانند `LEN()`, `LEFT()`, `SUBSTRING()`, `CHARINDEX()` و `PATINDEX()` در عبارت شرطی `IF` استفاده کنید. این قابلیت برای **اعتبارسنجی ورودیهای رشتهای در SQL** یا انجام عملیات بر اساس محتوای متنی بسیار مفید است.
مثال برای بررسی طول یک رشته:
DECLARE @UserName VARCHAR(50) = 'JohnDoe';
IF LEN(@UserName) > 5
PRINT 'Username is long enough.';
ELSE
PRINT 'Username is too short.';
در این مثال، چون طول ‘JohnDoe’ برابر 7 است (بزرگتر از 5)، پیام “Username is long enough.” نمایش داده میشود.
#### دستور IF تو در تو (Nested IF) در SQL Server
**دستور IF تو در تو در SQL Server** به شما امکان میدهد یک دستور `IF` را در داخل دستور `IF` دیگر قرار دهید. این ساختار برای **منطق شرطی چند سطحی در SQL** کاربرد دارد، جایی که نیاز به بررسی شرایط فرعی دارید که تنها پس از برآورده شدن یک شرط اصلی معنا پیدا میکنند.
مثال برای شرطبندی تو در تو:
DECLARE @ProductCategory VARCHAR(50) = 'Electronics';
DECLARE @Price DECIMAL(10, 2) = 150.00;
IF @ProductCategory = 'Electronics'
BEGIN
IF @Price > 100.00
PRINT 'High-priced electronic item.';
ELSE
PRINT 'Standard-priced electronic item.';
END
ELSE IF @ProductCategory = 'Books'
BEGIN
IF @Price > 50.00
PRINT 'Expensive book.';
ELSE
PRINT 'Affordable book.';
END
ELSE
PRINT 'Other category item.';
در این مثال، ابتدا دسته محصول بررسی میشود. اگر ‘Electronics’ باشد، سپس قیمت آن ارزیابی میشود. نتیجه، “High-priced electronic item.” خواهد بود.