حذف کاراکتر های ناخواسته توسط Recursive CTE قسمت دوم
سه شنبه 17 اردیبهشت 1392حذف کاراکتر های ناخواسته توسط Recursive CTE قسمت دوم <br/> در قسمت پیشین نشان داده شد که چگونه کاراکترهای خارج از رنج حروف الفبای انگلیسی از عبارات موجود در یک جدول حذف شدند.
مقدمه
در قسمت پیشین نشان داده شد که چگونه کاراکترهای خارج از رنج حروف الفبای انگلیسی از عبارات موجود در یک جدول حذف شدند.
اکنون شرایط کمی تغییر کرده است کاراکترهای ناخواسته در قالب یک مجموعه (جدول) به ما ارائه داده میشوند. ما بایستی تمام کاراکترهای داده شده را از عبارات (موجود در جدول) در صورت تطابق حذف کنیم.
جدول کاراکترهای ناخواسته Unwanted و جدول دادهها Data نامگذاری شده اند.
الگوریتم
قبل از هر چیزی فرض میگیریم که دادهها ستون Id جدول Unwanted کاملا متوالی نیستند و gap بین مقادیر id وجود دارد. پس برای داشتن مقادیر متوالی از تابع row_number استفاده شده است.
بعد از آن باید عباراتی که حداقل با یک کاراکتر ناخواسته تطابق پیدا میکنند انتخاب شوند. و عملیات پاکسازی روی این عبارات به تعداد کاراکترهای موجود در جدول unwanted انجام میشود. یعنی در مرحله اول شمارنده برابر است با تعداد کاراکترهای ناخواسته سپس در هر فراخوانی یک مقدار از این شمارنده کم شده تا اینکه به 0 برسد در اینجا کار به اتمام میرسد.
بعد از پایان یافتن فراخوانیهای query بازگشتی باید سطرهایی که شمارنده آنها برابر با 0 است انتخاب شده و عباراتی که در مرحله اول به دلیل عدم تطابق انتخاب نشدن بایستی به نتیجه اضافه شوند. این کار را توسط Union all انجام شده است.
در قسمت پیشین نشان داده شد که چگونه کاراکترهای خارج از رنج حروف الفبای انگلیسی از عبارات موجود در یک جدول حذف شدند.
اکنون شرایط کمی تغییر کرده است کاراکترهای ناخواسته در قالب یک مجموعه (جدول) به ما ارائه داده میشوند. ما بایستی تمام کاراکترهای داده شده را از عبارات (موجود در جدول) در صورت تطابق حذف کنیم.
جدول کاراکترهای ناخواسته Unwanted و جدول دادهها Data نامگذاری شده اند.
CREATE TABLE Data ( id INTEGER NOT NULL PRIMARY KEY IDENTITY, data VARCHAR(50) NOT NULL ); INSERT INTO Data VALUES ('~!hasan @#$%^&*(reza)[ali]^^^^^^^^'), ('(Ja[][][]va~!@#$*d-mohammad)'), ('Mohammad'), ('Maryam'); CREATE TABLE Unwanted ( id INT NOT NULL PRIMARY KEY IDENTITY, chars CHAR(1) NOT NULL UNIQUE ); INSERT Unwanted VALUES ('~'),('!'),('@'),('#'),('$'),('%'), ('['),(']'),('^'),('&'),('*');
قبل از هر چیزی فرض میگیریم که دادهها ستون Id جدول Unwanted کاملا متوالی نیستند و gap بین مقادیر id وجود دارد. پس برای داشتن مقادیر متوالی از تابع row_number استفاده شده است.
بعد از آن باید عباراتی که حداقل با یک کاراکتر ناخواسته تطابق پیدا میکنند انتخاب شوند. و عملیات پاکسازی روی این عبارات به تعداد کاراکترهای موجود در جدول unwanted انجام میشود. یعنی در مرحله اول شمارنده برابر است با تعداد کاراکترهای ناخواسته سپس در هر فراخوانی یک مقدار از این شمارنده کم شده تا اینکه به 0 برسد در اینجا کار به اتمام میرسد.
بعد از پایان یافتن فراخوانیهای query بازگشتی باید سطرهایی که شمارنده آنها برابر با 0 است انتخاب شده و عباراتی که در مرحله اول به دلیل عدم تطابق انتخاب نشدن بایستی به نتیجه اضافه شوند. این کار را توسط Union all انجام شده است.
WITH pre AS ( SELECT ROW_NUMBER() OVER(ORDER BY id) AS id, chars FROM Unwanted ), cte AS ( SELECT data.id, nbr, CAST(Data AS VARCHAR(50)) AS Data FROM Data CROSS JOIN (SELECT COUNT(*) AS nbr FROM Unwanted)t WHERE EXISTS (SELECT * FROM Unwanted WHERE Data LIKE '%#' + chars + '%' ESCAPE '#') UNION ALL SELECT C.id, nbr - 1, CAST(REPLACE(C.data, U.chars, '') AS VARCHAR(50)) FROM cte AS C INNER JOIN pre U ON C.nbr = U.id WHERE nbr > 0 ) SELECT data FROM cte WHERE nbr = 0 UNION ALL SELECT data FROM Data WHERE NOT EXISTS (SELECT id FROM cte WHERE cte.id = data.id);
- SQL Server
- 1k بازدید
- 0 تشکر