MySQL Stored function\SQL imkanları ilə text parsing(Advance Usage)

Bugünkü mövzu bir xeyli maraqlı olduğu üçün təcili olaraq qeyd etməkdən zövq alıram.
Əlimizdə olan cədvəlimiz:
CREATE TABLE `wd_universities` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, `country` tinyint(3) unsigned NOT NULL, `city` smallint(5) unsigned NOT NULL, `status` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8
Və içindəki məlumatlardan bir qismi:
*************************** 119. row *************************** id: 119 name: <!--az>9 N-li orta məktəb</az--><!--en>9 N-li orta məktəb</en--><!--ru>9 N-li orta məktəb</ru--> country: 0 city: 0 status: 0 *************************** 120. row *************************** id: 120 name: <!--az>Azerbaycan muellimler inisitutu</az--><!--en>Azerbaycan muellimler inisitutu</en--><!--ru>Azerbaycan muellimler inisitutu</ru--> country: 0 city: 0 status: 0
Gördüyümüz kimi 1 row daxilində
<!--az></az--> , <!--en></en-->, <!--ru></ru-->
tag-ləri arasında məlumatlar var. Bizə lazımdır ki,
<!--en></en-->
tag-ləri arasında olan məlumatı İD-ni verməklə götürək.
İlk öncə
<!--en></en-->
tag-lərinin yer aldığı row-ları match etməliyik. Burda regexp bizə yardım edir:
mysql> select id,name from wd_universities where name regexp '<\!--en>.*</en-->'; . . | 107 | <!--az>koopirasiya kolleci</az--><!--en>koopirasiya kolleci</en--><!--ru>koopirasiya kolleci</ru--> | | 108 | <!--az>Gəncə Dövlət Universiteti</az--><!--en>Gəncə Dövlət Universiteti</en--><!--ru>Gəncə Dövlət Universiteti</ru--> | | 109 | <!--az>Qafqaz Universiteti</az--><!--en>Qafqaz Universiteti</en--><!--ru>Qafqaz Universiteti</ru--> | | 110 | <!--az>Azerbaycan malliya iqtisad kolleci</az--><!--en>Azerbaycan malliya iqtisad kolleci</en--><!--ru>Azerbaycan malliya iqtisad kolleci</ru--> | | 111 | <!--az>QERB UNIVERSITETI</az--><!--en>QERB UNIVERSITETI</en--><!--ru>QERB UNIVERSITETI</ru-->
İkinci olaraq bizə bu row-lar daxilində
<!--en>
-li məlumatı çıxarmaq lazımdır. Onu da aşağıdakı sorğu ilə müəyyən edirik:
select
substring((select name from wd_universities where
name regexp '<!--en>.*</en-->' and id = 108),
locate('<!--en>',
(select name from wd_universities where
name regexp '<!--en>.*</en-->' and id = 108)),
(locate('</en-->',
(select name from wd_universities
where name regexp '<!--en>.*</en-->' and id = 108))) -
(locate('<!--en>',
(select name from wd_universities
where name regexp '<!--en>.*</en-->' and id = 108))));
Nümunə Output:
<!--en>Gəncə Dövlət Universiteti
Daha sonra bizə lazımdır ki tag-ləri əvvəldən və sondan silən bir funksiyamız olsun.Funksiya:
delimiter $$
CREATE FUNCTION fnStripTags( Dirty varchar(200) )
RETURNS varchar(200)
DETERMINISTIC
BEGIN
DECLARE iStart, iEnd, iLength int;
WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
BEGIN
SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
SET iLength = ( iEnd - iStart) + 1;
IF iLength > 0 THEN
BEGIN
SET Dirty = Insert( Dirty, iStart, iLength, '');
END;
END IF;
END;
END WHILE;
RETURN Dirty;
END $$
Funksiya istifadəsi:
mysql> select fnStripTags('<!--en>Gəncə Dövlət Universiteti');
+-----------------------------------------------------+
| fnStripTags('<!--en>Gəncə Dövlət Universiteti') |
+-----------------------------------------------------+
| Gəncə Dövlət Universiteti |
+-----------------------------------------------------+
1 row in set (0.00 sec)
Son olaraq və ən əsas olaraq bizim məntiqi sonluq yaradan funksiyamız. Funksiya parametr olaraq İD-ni qəbul edir. Bu İD-yə uyğun olan <!–en–>-li məlumatı tapır. Tag-ləri silir və bizə təmiz lazım olan məlumatı çıxardır:
DELIMITER $$
CREATE function exclude_tags_en(u_id int)
RETURNS varchar(150) charset utf8
DETERMINISTIC
BEGIN
declare v_name varchar(150) charset utf8;
declare v_last_row_fetched int default 0;
declare v_result varchar(150) charset utf8;
declare cursor1 cursor for
select name from wd_universities where name regexp '<\!--en>.*</en-->' and id=u_id;
declare continue handler for not found set v_last_row_fetched=1;
set v_last_row_fetched=0;
open cursor1;
cursor_loop: loop
fetch cursor1 into v_name;
if v_last_row_fetched=1 then
leave cursor_loop;
end if;
set @query_parse=(select substring((v_name),
locate('<!--en>',(v_name)),
(locate('</en-->',(v_name)))-(locate('<!--en>',(v_name)))));
set v_result=(SELECT fnStripTags(@query_parse));
return v_result;
end loop cursor_loop;
close cursor1;
set v_last_row_fetched=0;
END$$
Istifadəsi:
mysql> select exclude_tags_en(108); +-------------------------------+ | exclude_tags_en(108) | +-------------------------------+ | Gəncə Dövlət Universiteti | +-------------------------------+ 1 row in set (0.00 sec) mysql> select exclude_tags_en(109); +----------------------+ | exclude_tags_en(109) | +----------------------+ | Qafqaz Universiteti | +----------------------+ 1 row in set (0.00 sec)
Beləliklə tapşırıq yerinə yetirilmişdir.
Təşəkkürlər 😉

Şərhlər ( 1 )
Şəhriyar bəy aramıza xoş gəldiniz.
Uğur olsun !