कोई भी "बिल्टिन" फ़ंक्शन नहीं है जो MySQL में इस ऑपरेशन को करेगा।
एक विकल्प यह है कि आप अपना स्वयं का संग्रहित फ़ंक्शन बनाएं (यदि आपके पास डेटाबेस पर पर्याप्त विशेषाधिकार हैं)।
DELIMITER $$
DROP FUNCTION IF EXISTS `uf_only_digits`$$
CREATE FUNCTION `uf_only_digits`(as_val VARCHAR(65535))
RETURNS VARCHAR(65535)
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(65535);
DECLARE i INT;
DECLARE strlen INT;
-- shortcut exit for special cases
IF as_val IS NULL OR as_val = '' THEN
RETURN as_val;
END IF;
-- initialize for loop
SET retval = '';
SET i = 1;
SET strlen = CHAR_LENGTH(as_val);
do_loop:
LOOP
IF i > strlen THEN
LEAVE do_loop;
END IF;
IF SUBSTR(as_val,i,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN
SET retval = CONCAT(retval,SUBSTR(as_val,i,1));
END IF;
SET i = i + 1;
END LOOP do_loop;
RETURN retval;
END$$
DELIMITER ;
और परीक्षण करना सुनिश्चित करें इससे पहले कि आप इसे एक अद्यतन विवरण का उपयोग करें।
SELECT t.foo
, uf_only_digits(t.foo)
FROM ( SELECT '' AS foo
UNION ALL SELECT ' x'
UNION ALL SELECT 'a1b2'
UNION ALL SELECT '1-888-555-1212 ext 213'
UNION ALL SELECT '1-800-FLOWERS'
) t
रिटर्न:
foo uf_only_digits(t.foo) newlen
---------------------- --------------------- --------
0
x 0
a1b2 12 2
1-888-555-1212 ext 213 18885551212213 14
1-800-FLOWERS 1800 4
(अंतिम दो पंक्तियाँ हमें इस बात पर पुनर्विचार करने के लिए विराम दे सकती हैं कि हम वास्तव में क्या हासिल करना चाहते हैं। अगर यह मैं होता, तो मैं एक नया कॉलम बनाता, और इसमें मौजूदा मूल्य को सहेजता, इससे पहले कि मैं एक अद्यतन करता।)
-- new column same size as `phone` column
ALTER TABLE mytable ADD COLUMN orig_phone VARCHAR(40) NULL
COMMENT 'original phone value, before update to all digits';
UPDATE mytable t
SET t.orig_phone = t.phone ;
UPDATE mytable t
SET t.phone = uf_only_digits(t.phone) ;