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 😉

Səs: +10. Bəyənilsin Zəifdir

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

  1. Şəhriyar bəy aramıza xoş gəldiniz.

    Uğur olsun !

Şərh yazın