حذف کاراکتر های ناخواسته توسط Recursive CTE قسمت دوم
نویسنده: محمد سلیم آبادی
تاریخ: ۱۳۹۱/۱۱/۰۸ ۸:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
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 ('~'),('!'),('@'),('#'),('$'),('%'),
('['),(']'),('^'),('&'),('*');
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);