我有以下问题。
SELECT ....
FROM ....
WHERE "Phonenumber" LIKE '123456789'
AND "*****" IS NOT NULL
所以我的情况是我从文本文件中读取这些数字。这些数字写成“123456789”,但在我的Postgres数据库中,模式类似于“1234-56789”。
上述语句既不会产生任何错误,也不会产生任何数据集。所以我想知道如何编写一个忽略数字之间“ - ”的语句。
我试过正则表达式,但找不到符合我需要的解决方案。
答案 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
测试效果。