【问题标题】:Looking for phone number containing a minus, like "123-456789"查找包含减号的电话号码,例如“123-456789”
【发布时间】:2013-10-16 09:33:44
【问题描述】:

我有以下问题。

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

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

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

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

【问题讨论】:

  • 减号总是在同一个位置吗?
  • 没有。我从电话号码没有任何破折号的文本文件中读取数据。这些数字在数据库中也可用,但带有破折号。那么我如何用我从这个文本文件中读出的数字来查找这个数据集

标签: sql regex database postgresql


【解决方案1】:

您可以使用REPLACE 函数去除破折号:

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

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

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

【讨论】:

    【解决方案2】:

    要获取破折号在第四位数字之后且后跟五位数字的行:

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

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

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

    (所以至少是一位数字,然后是破折号,然后是至少一位数字)

    【讨论】:

    • 非常感谢您的回答!但我的问题是我必须寻找一个我从文本文件中读出的确切数字的人。文本文件--> 不带破折号的数字数据库--> 带破折号的数字。我需要一种方法来查找带有我从文本文件中加载的数字的特定数据集
    【解决方案3】:

    要替换一个或多个单个字符translate() 通常比replace()(可以替换整个字符串)更快(多次替换更短)。

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

    使用LIKE without wildcards也是没有意义的。替换为简单的=

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

    为了让更大的表更快,请创建一个匹配的functional index

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

    使用EXPLAIN ANALYZE 测试性能。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多