2013-10-16 33 views
0

我有以下問題。尋找包含減號的電話號碼,如「123-456789」

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

所以我的情況是,我從文本文件中讀出這些數字。這些數字寫成「123456789」,但在我的Postgres數據庫中,模式類似於「1234-56789」。

以上聲明不會產生任何錯誤,但不會產生數據集。所以我想知道如何寫一個忽略數字之間的「 - 」的陳述。

我試過正則表達式,但找不到適合我需求的解決方案。

+0

減號總是在同一位置嗎? – orique

+0

編號Im從電子文本沒有任何破折號的文本文件中讀取數據。這些數字在數據庫中也可用,但是有破折號。那麼,如何查找這個數據集與我讀出的這個文本文件的編號 – user2291070

回答

2

你可以只使用REPLACE功能剝離出破折號:

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

或者從您的文本文件處理字符串和插入第四和第五數字之間的破折號,然後使用那些您的SQL查詢。免責聲明:我不熟悉PostgreSQL語法,所以上面的查詢可能不完全正確(我從問題中的SQL中提取我的提示)。

0

讓那些行,其中破折號是第四位之後,接着是五個數字:

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

讓那些排在-在中間的任何地方:

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

(所以至少有一個數字,那麼破折號,然後至少一個數字)

+0

非常感謝您的回答!但我的問題是我不得不尋找一個人與我讀出的文本文件的確切數字。文本文件 - >沒有破折號的數據庫 - >帶短劃線的數字。我需要一種方法來查找這個特定的數據集,其中我加載的文本文件號爲i – user2291070

0

要替換一個或多個單個字符,translate()通常比replace()(可替換整個字符串)更快(並且對於多個替換更短)。

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

這也是毫無意義的使用LIKE without wildcards。用簡單的=代替。

如果pattern不包含百分號或者下劃線,那麼 模式只代表它本身;在這種情況下,LIKE的行爲與 等於運算符相同。

要使用更大的表使這個快速,創建一個匹配functional index:與EXPLAIN ANALYZE

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

測試性能。