MySQL’de RegExp ile Replace Kullanımı

Sniper tarafından 24 Eylül 2009 tarihinde yazıldı.

Bir projemde MySQL‘deki bir alanın değerinde RegExp kullanarak Replace işlemi yapma ihtiyacı duydum. Araştırdığımda MySQL’in Replace fonksiyonunun sadece string türünde parametre aldığını, dolayısıyla MySQL’in standart fonksiyonlarıyla bunu yapamayacağımı gördüm. Uzun zamandır Stored Procedure ve Stored Function konularını merak ettiğim halde hiç kullanma fırsatım olmamıştı. Bu durumu fırsat bilerek Regular Expression kullanarak değiştirme işlemi yapabileceğim bir Stored Function yazdım.

Hazırladığım fonksiyonun adı T_REGEXP_REPLACE, 3 parametre alıyor ve her üçü de VARCHAR veri tipinde. İlk parametrede değişikliğin uygulanacağı string, ikincisinde Regular Expression Deseni, üçüncüsünde ise değiştirilecek kısmın yerine konulacak karakter tanımlanır. Akılda kalıcı olsun diye kısaca şöyle de diyebiliriz: T_REGEXP_REPLACE(Neyi, Neye Göre, Neyle)

Aşağıdaki kodları MySQL Query Browser ya da muadili bir programla, kullanacağınız veritabanı üzerinde bir kez çalıştırıp fonksiyonu veritabanınıza ekleyin:

DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`T_REGEXP_REPLACE`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `T_REGEXP_REPLACE`(t_string VARCHAR(255) character set utf8, t_pattern VARCHAR(255), t_replacement VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
 
	/* Değişkenleri tanımlayalım */
	DECLARE t_length, t_cursor, t_regex TINYINT;
	DECLARE t_result VARCHAR(255) character set utf8;
 
	/* Başlangıç değerlerini atayalım */
	SET t_length = CHAR_LENGTH(t_string);
	SET t_cursor = 0;
	SET t_regex = 0;
	SET t_result = '';
 
 
	/* Tüm karakterleri tek tek pattern'imize tabi tutalım */	
	WHILE t_length>-1 DO		
		SELECT SUBSTRING(t_string, t_cursor, 1) REGEXP BINARY t_pattern INTO t_regex;
 
		IF t_regex THEN
			/* Pattern'e uyan karakterleri t_replacement ile değiştirelim */
			SELECT CONCAT(t_result, t_replacement) INTO t_result;
		ELSE
			/* Uymayanları olduğu gibi bırakalım */
			SELECT CONCAT(t_result, SUBSTRING(t_string, t_cursor, 1)) INTO t_result;
		END IF;
		SET t_length = t_length-1;
		SET t_cursor = t_cursor+1;		
	END WHILE;
	RETURN(t_result);
END$$
 
DELIMITER ;

Herhangi bir uyarı ya da hata mesajı almadıysanız ilk denemenizi yapabilirsiniz. Aşağıda “mysql” isimli veritabanının “help_category” tablosu üzerinde çalıştırılan sorgu ve çıktısını görebilirsiniz. Sorgu; help_category tablosunun name alanındaki değerlerde geçen tüm büyük harfleri “-” karakteri ile değiştirir.

SELECT name AS OriginalName, T_REGEXP_REPLACE(name, '[A-Z]+', '-') AS ReplacedName FROM help_category h LIMIT 0,10

t_regexp_replace screenshot

8 kişi bunu beğendi.

Etiketler: , , , ,

“MySQL’de RegExp ile Replace Kullanımı” yazısına 3 yorum yapılmış

  1. Güzel bir yazı; Regular Expression konusunu Javascript ve PHP ile yaptım fakat MySQL ile yapmayı hiç düşünmemiştim. Konu gerçekten çok güzel, eline koluna sağlık.

  2. Özellikle MySQL için ayrı server kullananların çok işine yarayacağını düşünüyorum. Web server’a yük bindirmeden bu gibi küçük fonksiyonları MySQL üzerinden çalıştırmak sistemi az da olsa rahatlatacaktır.

  3. Çok faydalı bir yazı..
    Daha önce php de yapıyordum,, bu yazıdan sonra mutlaka bu yöntemi kullanıcam, teşekkurler :D

Yorum Ekle