آموزش کامل تابع UPPER در SQL: تبدیل متن به حروف بزرگ
تابع `UPPER` در SQL Server یکی از توابع مهم رشتهای است که برای تبدیل تمام حروف یک رشته متنی به حروف بزرگ (Uppercase) مورد استفاده قرار میگیرد. این تابع برای یکسانسازی دادهها، جستجوهای غیرحساس به حروف و بهبود خوانایی گزارشها بسیار کاربردی است.
نحو استفاده از تابع `UPPER` بسیار ساده است و تنها یک آرگومان دریافت میکند:
`UPPER ( string_expression )`
در اینجا، `string_expression` عبارتی از نوع کاراکتر (مانند `NVARCHAR`، `VARCHAR`، `CHAR`) است که میخواهید آن را به حروف بزرگ تبدیل کنید.
مثال 1: استفاده از تابع UPPER برای تبدیل یک رشته ساده
در ابتدا با یک مثال ساده شروع میکنیم. در این مثال، یک رشته متنی را مستقیماً به تابع `UPPER` میدهیم تا آن را به حروف بزرگ تبدیل کند:
SELECT UPPER('sql upper function tutorial');
خروجی این دستور، رشته `SQL UPPER FUNCTION TUTORIAL` خواهد بود که تمام حروف آن به بزرگ تغییر یافتهاند.
مثال 2: استفاده از تابع UPPER بر روی دادههای جدول
اکنون، کاربرد تابع `UPPER` را روی دادههای یک جدول واقعی بررسی میکنیم. از جدول `[Person].[Person]` در پایگاه داده `AdventureWorks2019` برای این منظور استفاده میکنیم تا ببینیم چگونه میتوان ستونهای `FirstName` و `LastName` را به حروف بزرگ تبدیل کرد:
SELECT
FirstName,
LastName,
EmailPromotion,
UPPER(FirstName) AS FirstName_Uppercase,
UPPER(LastName) AS LastName_Uppercase
FROM [Person].[Person];
این دستور، نام و نام خانوادگی افراد را در ستونهای جدید `FirstName_Uppercase` و `LastName_Uppercase` به صورت تمام حروف بزرگ نمایش میدهد.
مثال 3: بهروزرسانی رکوردها با استفاده از تابع SQL UPPER
تابع `UPPER` را میتوان در دستور `UPDATE` نیز به کار برد تا دادههای موجود در یک ستون را به حروف بزرگ تبدیل و ذخیره کند. ابتدا یک جدول آزمایشی `Employee` ایجاد و با دادههای نمونه پر میکنیم، سپس ستون `Name` را بهروزرسانی میکنیم:
--Create a dummy table for the demo
CREATE TABLE Employee
(
Id INT IDENTITY(1,1),
Name VARCHAR(50),
Designation VARCHAR(50)
);
--Insert sample data
INSERT INTO Employee VALUES
('david', 'consultant'),
('ROBERT', 'manager'),
('albert', 'Architect'),
('JAY', 'PROGRAMMER');
--See the existing data
SELECT * FROM Employee;
--Update the Name column to uppercase
UPDATE Employee SET Name = UPPER(Name);
--Verify the updated data
SELECT * FROM Employee;
این عملیات، تمام مقادیر موجود در ستون `Name` را به حروف بزرگ تبدیل کرده و تغییرات را به صورت دائمی در جدول اعمال میکند. این کاربرد برای یکسانسازی فرمت دادهها (Data Standardization) بسیار مفید است.
مثال 4: استفاده از تابع UPPER در بند WHERE
یکی از کاربردهای مهم تابع `UPPER`، استفاده از آن در بند `WHERE` برای انجام جستجوهای غیرحساس به حروف (Case-Insensitive Search) است. با این کار، حتی اگر داده در پایگاه داده با حروف کوچک یا ترکیبی ذخیره شده باشد، میتوانیم آن را با یک الگوی حروف بزرگ پیدا کنیم:
SELECT * FROM Employee
WHERE UPPER(Name) = 'JAY';
این کوئری، رکوردی را پیدا میکند که نام آن `jay`، `Jay` یا `JAY` باشد، زیرا قبل از مقایسه، تمام نامها را به حروف بزرگ تبدیل میکند.
مثال 5: استفاده از تابع UPPER در بند ORDER BY
برای مرتبسازی نتایج یک کوئری به شکلی که حساس به حروف نباشد (Case-Insensitive Sorting)، میتوان از تابع `UPPER` در بند `ORDER BY` استفاده کرد. این کار باعث میشود که ‘apple’, ‘Apple’ و ‘APPLE’ همگی در کنار هم قرار بگیرند:
SELECT * FROM Employee
ORDER BY UPPER(Name);
با اعمال `UPPER(Name)` در `ORDER BY`، ترتیب نمایش نتایج بر اساس نسخه تمام حروف بزرگ نامها خواهد بود و دیگر حروف کوچک و بزرگ در مرتبسازی تفاوتی ایجاد نمیکنند.
مثال 6: استفاده از تابع UPPER در بند GROUP BY
برای گروهبندی دادهها به صورت غیرحساس به حروف، تابع `UPPER` در بند `GROUP BY` کاربرد دارد. این ویژگی زمانی مفید است که بخواهید رکوردهای مشابه را که فقط در حروف کوچک و بزرگ تفاوت دارند، به عنوان یک گروه واحد در نظر بگیرید، مثلاً `consultant` و `Consultant`:
SELECT UPPER(Designation) AS Designation_Uppercase, COUNT(*) AS TotalEmployees
FROM Employee
GROUP BY UPPER(Designation);
این کوئری، تعداد کارمندان را بر اساس سمتهای شغلی که به حروف بزرگ تبدیل شدهاند، محاسبه میکند. این روش تضمین میکند که `Manager` و `manager` به عنوان یک گروه واحد `MANAGER` در نظر گرفته شوند.
مثال 7: استفاده از تابع UPPER با بند COLLATE
میتوانید از بند `COLLATE` همراه با تابع `UPPER` استفاده کنید. بند `COLLATE` برای مشخص کردن قواعد مرتبسازی و مقایسه کاراکترها (Collation) به کار میرود. این امر به شما امکان میدهد تا نحوه رفتار با حروف کوچک و بزرگ، علائم نگارشی و… را در عملیات متنی کنترل کنید.
برای مقایسه حساس به حروف، از `COLLATE Latin1_General_CS_AS` استفاده میشود. همانطور که میدانید، `CS` به معنای حساس به حروف (Case-Sensitive) است. با این تنظیم، حتی اگر از `UPPER` استفاده کنید و رشته به حروف بزرگ تبدیل شود، ممکن است مقایسه آن با یک رشته دیگر در شرایط خاص، به خاطر تفاوتهای جزئی در Collation یا رفتار دقیق سیستم، منجر به نتیجه مورد انتظار نشود و مقایسه ناموفق باشد:
SELECT 'sqlserver' WHERE UPPER('SQLServer') COLLATE Latin1_General_CS_AS = 'SQLSERVER';
طبق توضیحات موجود در منبع، این کوئری هیچ خروجی را برنمیگرداند. دلیل این امر به نحوه عملکرد `COLLATE` در کنار `UPPER` در برخی سناریوها برمیگردد که با وجود تبدیل به حروف بزرگ، مقایسه با الگوی مورد نظر در محیط حساس به حروف، نتیجه مطابقی را تولید نمیکند.
برای دریافت خروجی مورد انتظار در چنین مواردی، باید از `COLLATE` غیرحساس به حروف (Case-Insensitive) مانند `CI` استفاده کنید:
SELECT 'sqlserver' WHERE UPPER('SQLServer') COLLATE Latin1_General_CI_AS = 'SQLSERVER';
با استفاده از `COLLATE Latin1_General_CI_AS`، مقایسه بین `’SQLSERVER’` (که از `UPPER(‘SQLServer’)` حاصل شده) و `’SQLSERVER’` به صورت غیرحساس به حروف انجام میشود و در نتیجه، کوئری `’sqlserver’` را به عنوان خروجی برمیگرداند.
مثال 8: تابع UPPER در مقابل تابع LOWER
تابع `LOWER` در SQL Server عملکردی مشابه `UPPER` دارد، با این تفاوت که تمام حروف یک رشته را به حروف کوچک (Lowercase) تبدیل میکند. این دو تابع مکمل یکدیگر در مدیریت حالت حروف هستند:
SELECT UPPER('SQL LOWER FUNCTION') AS UppercaseText,
LOWER('SQL LOWER FUNCTION') AS LowercaseText;
این دستور، رشته `’SQL LOWER FUNCTION’` را یک بار به تمام حروف بزرگ و یک بار به تمام حروف کوچک تبدیل و نمایش میدهد.
مثال 9: تابع UPPER در مقابل تابع INITCAP
در مقابل `UPPER` که همه حروف را بزرگ میکند، تابع `INITCAP` حرف اول هر کلمه در یک رشته را به حروف بزرگ و بقیه حروف آن کلمه را به حروف کوچک تبدیل میکند. این تابع برای فرمتدهی اسامی و عناوین بسیار مفید است. توجه داشته باشید که `INITCAP` به صورت پیشفرض در SQL Server وجود ندارد و اغلب در سیستمهای پایگاه دادهای مانند Oracle یافت میشود. اگر به آن در SQL Server نیاز دارید، باید یک تابع تعریف شده توسط کاربر (User-Defined Function) ایجاد کنید. با این حال، برای مقایسه عملکردی، مثال آن را ارائه میدهیم:
--Create a dummy table for the demo
CREATE TABLE [dbo].[Names]
(
[ID] INT IDENTITY(1,1) NOT NULL,
[FullName] [varchar](50) NULL
) ON [PRIMARY];
--Insert sample data
INSERT INTO [dbo].[Names] ([FullName]) VALUES ('john doe');
INSERT INTO [dbo].[Names] ([FullName]) VALUES ('ROBERT PATTINSON');
INSERT INTO [dbo].[Names] ([FullName]) VALUES ('albert einstein');
--Use UPPER and INITCAP functions
-- Note: INITCAP is not a native SQL Server function.
-- It's shown here for conceptual comparison.
-- You would need to implement it as a UDF in SQL Server.
SELECT FullName, UPPER(FullName) AS FullName_Uppercase, INITCAP(FullName) AS FullName_Initcap
FROM [dbo].[Names];
این کوئری، ستون `FullName` را به سه صورت نمایش میدهد: حالت اصلی، حالت تمام حروف بزرگ با `UPPER`، و حالتی که حرف اول هر کلمه بزرگ و بقیه کوچک شدهاند (توسط تابع `INITCAP` که فرض میشود موجود است یا پیادهسازی شده).