寻找包含减号的电话号码,例如“123-456789”

时间:2013-10-16 09:33:44

标签: sql regex database postgresql

我有以下问题。

SELECT ....
FROM  .... 
WHERE "Phonenumber" LIKE '123456789'
  AND "*****" IS NOT NULL

所以我的情况是我从文本文件中读取这些数字。这些数字写成“123456789”,但在我的Postgres数据库中,模式类似于“1234-56789”。

上述语句既不会产生任何错误,也不会产生任何数据集。所以我想知道如何编写一个忽略数字之间“ - ”的语句。

我试过正则表达式,但找不到符合我需要的解决方案。

3 个答案:

答案 0 :(得分:2)

您可以使用REPLACE功能删除破折号:

SELECT ...
FROM ...
WHERE REPLACE("Phonenumber", '-', '') LIKE '123456789'
AND ...

或者处理文本文件中的字符串,并在第四个和第五个数字之间插入短划线,然后将它们用于SQL查询。

免责声明:我不熟悉PostgreSQL语法,因此上述查询可能不完全正确(我从问题中的SQL中提取了我的提示)。

答案 1 :(得分:0)

要获得破折号位于第四位数后面且后跟五位数的行:

where "Phonenumber" ~ '[0-9]{4}-[0-9]{5}'

要获取-位于中间位置的那些行:

where "Phonenumber" ~ '[0-9]+-[0-9]+'

(所以至少有一个数字,然后短划线,然后至少再多一个数字)

答案 2 :(得分:0)

要替换一个或多个单个字符translate()通常比replace()(可替换整个字符串)更快(并且对于多次替换而言更短)。

...
WHERE translate("Phonenumber", '-', '') = '123456789'

使用LIKE without wildcards也毫无意义。替换为简单的=

  

如果 pattern 不包含百分号或下划线,那么   pattern只代表字符串本身;在这种情况下LIKE就像   等于运算符。

要使用更大的表格快速创建,请创建匹配的functional index

CREATE INDEX tbl_phone_idx ON tbl (translate("Phonenumber", '-', '')

使用EXPLAIN ANALYZE测试效果。

相关问题