0

我有以下问题。

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

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

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

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

4

3 回答 3

2

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

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

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

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

于 2013-10-16T09:57:46.183 回答
0

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

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

LIKE不使用通配符也毫无意义。替换为简单的=.

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

为了让更大的表更快,创建一个匹配的函数索引

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

用 测试性能EXPLAIN ANALYZE

于 2013-10-16T15:54:24.667 回答
0

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

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

要获取-中间任何位置的行:

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

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

于 2013-10-16T10:00:11.273 回答