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 !