مقایسه رشته های منتهی به فضای خالی
نوشته شده توسط محسن بندامیر-
تاریخ ایجاد در دوشنبه, 20 شهریور 1396
-
بازدید: 1298
مقایسه رشته های منتهی به فضای خالی - مقدمه
در زمان طراحی کوئری یکی از روش های افزایش سرعت اجرا، کاهش تعداد رکوردهای بازگشتی از طریق نوشتن شرط مقایسه ای در عبارت Where است. این مقایسه می تواند به ازای هر نوع داده ای مانند مقادیر عددی، تاریخ و ... باشد. اما زمانی که بحث مقایسه مقادیر رشته ای مطرح می شود بهتر است با نحوه مقایسه رشته های منتهی به فضای خالی در sql server آشنایی داشته باشیم. ایجاد فضای خالی در انتهای رشته ها می تواند به علت در نظر گرفتن تعداد کاراکتر ثابت برای تمام مقادیر یک فیلد(char) و یا درج space توسط کاربر در زمان وارد کردن مقادیر انجام شده باشد. در هر صورت وجود این کاراکترها در انتهای رشته می تواند منجر به تولید خروجی اشتباه و یا ایجاد خطا در برخی از عملیات شود. (جهت حذف فضاهای خالی از توابع LTRIM و RTRIM استفاده کنید)
مقایسه رشته های منتهی به فضای خالی - عملگر تساوی
در صورتی که برای مقایسه رشته های منتهی به فضای خالی از عملگر "=" استفاده کنیم و دو رشته مقایسه شده دارای کاراکترهای یکسانی(غیر از space) باشند، همواره نتیجه مقایسه برابر با True خواهد بود:
نکته: کلیه مقادیر موجود در فیلد col1 از جدول trailing-space باید دارای 20 کاراکتر باشند((nchar(20). در صورتی که تعداد کاراکتر یک رشته کمتر از 20 باشد، با اضافه کردن space به انتهای آن، طول آن رشته به 20 کاراکتر تبدیل می شود.
روش انجام عملیات در مقایسه رشته های منتهی به فضای خالی با استفاده از عملگر "=" به اینصورت است که ابتدا رشته کوچکتر را انتخاب و با اضافه کردن Space به انتهای آن، طول این رشته را با رشته بزرگتر یکسان شده و سپس مقایسه انجام می شود:
مقایسه رشته های منتهی به فضای خالی - عملگر 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’- فاقد خروجی
نکته: در حالت 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 تحت آموزشیجداگانه در مورد آن صحبت خواهیم کرد.
ترفندهای SQL SERVER
- مقدمه ای بر ترفندهای sql server
- خطر استفاده از عملگر Not IN
- مقایسه تابع COALESCE با ISNULL
- کشف دلیل کندی سرعت کوئری در یک نگاه!
- نحوه خواندن EXECUTION PLAN
- مقایسه رشته های منتهی به فضای خالی
- اجرای اسکریپت های حجیم
- اس کیو ال یا سی کو ال
- ترتیب اجرای دستورات کوئری
- shrink لاگ فایل و نجات دیتابیس
- مدیریت صحیح حجم لاگ فایل
- تشخیص قابل shrink بودن لاگ فایل
- دور زدن محدودیت Row_Number
- تغییر server name بعد از نصب sql server
- بازیابی رکوردهای حذف شده