Raketenheinz: Telefonnnummern normalisieren - Lösung mit Funktion für Update, Insert, Select

Beitrag lesen

Ich habe die bereits vorgestellte Lösung für MySQL >=8 und MariaDB >= 10.0.5 so vervollständigt, dass eine Funktion erstellt wird, welche sodann für Updates, Inserts und Where-Klauseln benutzt werden kann:

USE `test`;
DROP TABLE IF EXISTS `ptest`;
CREATE table `ptest`(  `t` TEXT(30) ,  `t_n` TEXT(30) );

INSERT INTO `ptest` (`t`) VALUES('099 123456789');
INSERT INTO `ptest` (`t`) VALUES('099 1234567 89');
INSERT INTO `ptest` (`t`) VALUES('0049 99 1234567-89');
INSERT INTO `ptest` (`t`) VALUES('+49 99 1234567-89');
INSERT INTO `ptest` (`t`) VALUES('++49 99 1234567-89');
INSERT INTO `ptest` (`t`) VALUES('0049 (0)99 1234567-89');
INSERT INTO `ptest` (`t`) VALUES('+49 (0)99 1234567-89');
INSERT INTO `ptest` (`t`) VALUES('++49 (0)99 1234567-89');

DROP FUNCTION IF EXISTS t_clear;
DELIMITER $$
CREATE FUNCTION t_clear (s TEXT(30) ) RETURNS text(30)
BEGIN
	SET s = CONCAT ( 
		'00',
		REGEXP_REPLACE (
			REGEXP_REPLACE (
				REPLACE (
					REGEXP_REPLACE( 
						s,
						'^\\+\\+|^00',
						'+'
					),
					'(0)',
					''
				),
				'^0',
				'49'
			),
			'[^0-9]',
			''
		)
	);
	RETURN s;
END$$
DELIMITER ;

UPDATE `ptest` SET `t_n` = t_clear(`t`);

INSERT INTO `ptest` VALUES ( '0561 123456789', t_clear('0561 123456789') );

SELECT '- ALLE: -----------------------------------------------' as '';
SELECT `t`, `t_n` FROM `ptest`;
SELECT '- Mit 049561 beginnend: -------------------------------' as '';
SELECT `t`, `t_n` FROM `ptest` WHERE `t_n` LIKE '0049561%';
SELECT '- Mit 0561 beginnend: ----------------------------------' as '';
SELECT `t`, `t_n` FROM `ptest` WHERE `t_n` LIKE CONCAT( t_clear('0561'), '%' ) ;
SELECT '-------------------------------------------------------' as '';

Tabelle und Funktion müssen natürlich nur einmal erstellt und das Update nur einmal durchgeführt werden. Bereits existierende Abfragen müssen dann natürlich auch angepasst werden…