对于移动应用程序,我们正在考虑根据用户的移动电话号码进行验证。
在应用程序中,我们将限制用户输入,以便以下列格式存储:
这意味着在这种情况下,瑞典的电话号码(+46),删除初始的0,然后保留其余的9位数字(这里的移动电话号码是10位,包括前面的0)。
但是,目前保存在数据库中的数据包含很多行,输入时不进行验证。这意味着保存的数字可以采用许多不同的格式,包括
因此,数据库中列的类型可能是varchar。
此时,我无法将数据库中已经保存的数字实际更新为一种通用格式,例如使用降钙素。我也希望将实际查询的数量限制在数据库上。
该数据库目前包括大约10+国家的电话号码,所有这些国家都以不同的格式保存。所使用的数据库管理系统是MySQL。
在不查询数据库中任何可能的格式的情况下,怎样才能准确匹配数字呢?
发布于 2018-05-02 17:11:23
这可能是一场闹剧。我首先使用替换函数来清除所有的('(',')','-')垃圾。您也可以将其添加到通用中,尽管这将更加困难。看起来会是这样的:
select replace(replace(replace(p.phone,'-',''),'(',''),')','')
from people p若要使每一个数字10位数,如果它较短,则左侧为零,您可以这样做:
select right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
from people p 至于国家代码..。理想情况下,它们将出现在自己的专栏中,但您可以在之后将它们添加到如下内容中:
select '011' + right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
from people p
where country = 'America'整件事情应该是这样的(如果它是一张很大的桌子,可以分批处理它):
select * into people_bak from people
update p
set Phone =
'011' + right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
from people p
where country = 'America'
select PostalCode, * from people发布于 2018-05-19 13:53:43
正确的做法是在数据进入时进行修复。然后只有“规范”格式的数字字符串。这包括以国家代码作为前缀。(不过,您可能希望保留前面的“+”,这样查看数据库的用户就会知道国家代码在那里。)
如果必须重复修正SELECT端的数字,则无法获得合理的性能。
https://dba.stackexchange.com/questions/205568
复制相似问题