ورود ثبت نام

ورود به حساب کاربری

نام کاربری *
رمز ورود *

ایجاد حساب کاربری

گزینه های * دار الزامی می باشند.
نام *
نام کاربری *
رمز ورود *
تائیدیه رمز ورود *
نشانی پست الکترونیک *
تائیدیه پست الکترونیک *

مقایسه رشته های منتهی به فضای خالی - مقدمه

در زمان طراحی کوئری یکی از روش های افزایش سرعت اجرا، کاهش تعداد رکوردهای بازگشتی از طریق نوشتن شرط مقایسه ای در عبارت Where است. این مقایسه می تواند به ازای هر نوع داده ای مانند مقادیر عددی، تاریخ و ... باشد. اما زمانی که بحث مقایسه مقادیر رشته ای مطرح می شود بهتر است با نحوه مقایسه رشته های منتهی به فضای خالی در sql server آشنایی داشته باشیم. ایجاد فضای خالی در انتهای رشته ها می تواند به علت در نظر گرفتن تعداد کاراکتر ثابت برای تمام مقادیر یک فیلد(char) و یا درج space توسط کاربر در زمان وارد کردن مقادیر انجام شده باشد. در هر صورت وجود این کاراکترها در انتهای رشته می تواند منجر به تولید خروجی اشتباه و یا ایجاد خطا در برخی از عملیات شود. (جهت حذف فضاهای خالی از توابع LTRIM و RTRIM استفاده کنید)


مقایسه رشته های منتهی به فضای خالی - عملگر تساوی

در صورتی که برای مقایسه رشته های منتهی به فضای خالی از عملگر "=" استفاده کنیم و دو رشته مقایسه شده دارای کاراکترهای یکسانی(غیر از space) باشند، همواره نتیجه مقایسه برابر با True خواهد بود:

strings-trailing-space-comparison-equality

strings-trailing-space-comparison-notice1نکته: کلیه مقادیر موجود در فیلد col1 از جدول trailing-space باید دارای  20 کاراکتر باشند((nchar(20). در صورتی که تعداد کاراکتر یک رشته کمتر از 20 باشد، با اضافه کردن space به انتهای آن، طول آن رشته به 20 کاراکتر تبدیل می شود.

 روش انجام عملیات در مقایسه رشته های منتهی به فضای خالی با استفاده از عملگر "=" به اینصورت است که ابتدا رشته کوچکتر را انتخاب و با اضافه کردن Space به انتهای آن، طول این رشته را با رشته بزرگتر یکسان شده و سپس  مقایسه انجام می شود:

strings-trailing-space-comparison-sample1


مقایسه رشته های منتهی به فضای خالی - عملگر LIKE

اولین نکته در رابطه با مقایسه رشته های منتهی به فضای خالی با استفاده ار عملگر like این است که شیوه کار آن کاملاً متفاوت با  عملگر "="  می باشد چون از مقایسه  الگو یا pattern matching استفاده می کند. در این روش، الگو(pattern) از روی رشته ای که قصد داریم جستجو کنیم ساخته میشود ( رشته ای که بعد از Like نوشته میشود). دومین نکته این است که عملگر like در مقایسه رشته های منتهی به فضای خالی از دو نوع الگو استفاده میکند که بستگی به نوع رشته مورد مقایسه دارد. این دو الگو   ASCII Pattern, UNICODE Pattern نام دارند.

حالت ASCII Pattern:

این حالت زمانی استفاده میشود که رشته های مورد مقایسه از نوع Unicode نباشند. در این حالت اگر رشته مورد مقایسه، با الگوی ما همخوانی داشته باشد، از فضاهای خالی انتهای رشته صرف نظر میشود و نتیجه مقایسه برابر با True خواهد بود:

CREATE TABLE t (col1 char (30)) 
INSERT INTO t VALUES (Mohsen Bandamir) 
SELECT *      FROM t 
WHERE col1 LIKE '% Bandamir' – یک ردیف برگردانده می شود 

دقت کنید در رشته مورد جستجو(pattern) فضای خالی (space) وجود دارد.

حالت Unicode Pattern:

این حالت زمانی استفاده میشود که رشته های مورد مقایسه از نوع Unicode باشند. بر خلاف حالت ASCII Pattern این الگو نسبت به وجود فضای خالی حساسیت دارد:

CREATE TABLE t (col1 nchar (30)) 
INSERT INTO t VALUES (‘Mohsen Bandamir’)
SELECT *   FROM t 
WHERE col1 LIKE '% Bandamir’- فاقد خروجی 

strings-trailing-space-comparison-ascii-unicode-pattern

strings-trailing-space-comparison-notice2نکته: در حالت ASCII Pattern در ابتدا بایستی رشته مورد مقایسه، با الگوی ما همخوانی داشته باشد تا در ادامه از فضاهای خالی انتهای آن رشته صرف نظر شود.

select case when 'Bandamir'   like'Bandamir  '  then 1 else 0 end    ---return 0

در مثال بالا به دلیل اینکه رشته مورد مقایسه('Bandamir') با الگو یا همان عبارت جلوی عملگر like یعنی('   Bandamir') همخوانی ندارد، مقدار صفر را در خروجی مشاهده می کنیم. به عنوان تمرین بیشتر مثال های زیر را در sql server اجرا و نتیجه را بررسی کنید:

--مثالی دیگر از ASCII Pattern

select case when 'Bandamir  ' like'Bandamir'  then 1 else 0 end  ---return 1
select case when 'Bandamir'   like'Bandamir  '  then 1 else 0 end    ---return 0

--مثالی دیگر از Unicode Pattern

select case when N'Bandamir  ' like N'Bandamir'  then 1 else 0 end  ---return 0
select case when N'Bandamir'   like N'Bandamir '  then 1 else 0 end    ---return 0

 

این نکته رو هم در پایان آموزش  مقایسه رشته های منتهی به فضای خالی اضافه کنم که در مقایسه و مرتب سازی نوع داده ای رشته ای، مفهوم کولیشن (Collation ) از اهمیت خاصی برخوردار است که در  مجموعه چیستان sql تحت آموزشیجداگانه در مورد آن صحبت خواهیم کرد.

نوشتن دیدگاه


تصویر امنیتی
تصویر امنیتی جدید