我有一个带有用户表的数据库。该表包含一列16138649264659050412
。问题在于它的字段使用多个数字模式。
我发现的当前模式:
在数据库中搜索用户时,是否可以搜索所有数字模式?
phonenumber
我使用Oracle和MS SQL
答案 0 :(得分:4)
假设您的问题是这样的:
“在WHERE
子句中进行比较之前,是否可以从存储的电话号码中删除所有非数字字符?”
可能的解决方案如下:
...
where translate(phone, '0123456789' || phone, '0123456789') = <input value here>
TRANSLATE
会将每个数字转换为自身,而phone
中的所有其他字符则转换为零(它们将从字符串中删除)。这正是您想要的。
如果发现查询速度很慢,则可能要在translate(phone, '0123456789' || phone, '0123456789')
上创建(基于函数的)索引。
编辑:我错过了您所说的同时使用Oracle和SQL Server的部分。我进行了快速搜索,发现SQL Server没有类似于Oracle TRANSLATE
的功能。我将它留给SQL Server专家来帮助您完成这一部分。我不知道SQL Server。
答案 1 :(得分:3)
在Oracle中,您可以这样做。用translate()
去除非数字字符以获取电话号码。您需要处理前导零或国际拨号代码:
select username from your_table
where translate(phone, '1234567890+/ -', '1234567890') in ('064039750', '4964039750')
如果您不知道国际拨号代码是什么,则可能需要进行调整。
显然,实际问题是数据质量之一:应用程序应对电话号码强制采用严格的格式。写入时进行一连串的数据清理可以节省读取时的麻烦。
答案 2 :(得分:2)
您有一个包含电话号码的数据库。这些有时是国际格式,但经常是某些国家格式,可能是德语,其中两个前导零会引入一个国家代码,而一个前导零会引入一个区号(假设本国德国)。而且,电话号码可以包含可读性的符号,即'-'
,'/'
和' '
。
所以
我建议您按照以下步骤将所有数字转换为国际格式:
+
替换为前导00
,从而仅使数字变得重要00
替换为领先的+
0
替换为领先的+49
为此使用Oracle的REGEXP_REPLACE
:
select
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(trim(phone),
'^\+', '00'), -- leading '+' -> leading '00'
'[^[:digit:]]', ''), -- remove all non-digits
'^00' , '+'), -- leading '00' -> leading '+'
'^0', '+49') -- leading '0' -> leading '+49'
as international_phone
from mytable;
您当然可以在WHERE
子句中做到这一点:
SELECT id FROM user WHERE regexp_replace(...) = '+49123456789'
甚至
SELECT id FROM user WHERE regexp_replace(...phone...) = regexp_replace(...'0123456789'...)
为方便起见,您可以为此编写一个PL / SQL函数,并这样使用:
SELECT id FROM user WHERE international_phone(phone) = international_phone('0123456789')
这是针对Oracle的。对于SQL Server可能会有一些相似之处。