我有一个webform的结果集,其中包含每个集的电话号码.此电话号码的格式未强制执行(有些是xxxxxxxxxx,有些是(xxx)xxx-xxxx,有些是xxx-xxx-xxxx).这是短视的,现在我需要能够根据电话号码得到结果(视图暴露过滤器).
我解决此问题的最佳方法是使用sql查询重新格式化此字段中的值,以便它们被剥离任何非数字值.我已经尝试了几个我在类似问题上找到的函数,但似乎没有工作(我正在使用mysql工作台并获得"函数不存在"错误).这是我正在做的一次,我正在寻找一个可以运行的查询,它将删除所有非数字值.我只需要运行一次,因为我从这里验证电话号码只是数字.
有没有一个SQL查询可以做我需要的?用PHP就可以了
update table set data = preg_replace("/[^0-9]/", "", data) where condition
Run Code Online (Sandbox Code Playgroud)
但我似乎无法通过SQL找到一种方法.
没有任何"内置"函数可以在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 ;
Run Code Online (Sandbox Code Playgroud)
并且在使用UPDATE语句之前一定要测试它.
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
Run Code Online (Sandbox Code Playgroud)
返回:
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
Run Code Online (Sandbox Code Playgroud)
(最后两行可能会让我们停下来重新考虑我们真正想要实现的目标.如果是我,我会创建一个新列,并在我进行更新之前保存其中的现有值.)
-- 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) ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8604 次 |
| 最近记录: |