2010-02-11 117 views
16

嘿,我的第一個問題就是這樣! Anywho ...SQL - 組合多個查詢

還是比較新的SQL,所以我想我可能會錯過這裏的東西。我的問題是我目前有一張桌子上裝滿了電話號碼。我想查詢一下我在哪裏搜索與我擁有的列表類似的電話號碼。例如,我想查找以'555123','555321'和'555987'開頭的電話號碼。我通常知道,如果你有一個數字列表,你可以只是做一個查詢,如

SELECT * 
    FROM phonenumbers 
WHERE number in ('5551234567', '5559876543', ....); 

有沒有辦法做到這一點像?如

SELECT * 
    FROM phonenumbers 
WHERE number in like ('555123%', '555321%', '555987%'); //I know this doesn't actually work 

而不是必須單獨做到這一點

SELECT * 
    FROM phonenumbers 
WHERE number like '555123%' 
    or number like '555321%' 
    or number like '555987%'; //Which does work but takes a long time 

或者是有一個更容易做到這一點,我只是失蹤?我使用postgres,我不知道是否有任何命令可以幫助解決這個問題。謝謝!

+1

歡迎SO!我已經重申您的問題,澄清它與postgres – AdaTheDev 2010-02-11 15:41:28

+0

什麼版本的Postgres?聽起來像一個正則表達式的工作:http://www.postgresql.org/docs/8.3/static/functions-matching.html – 2010-02-11 15:47:21

+0

'哪些工作,但需要很長時間 - - 除非你改變查詢的性質,一個同一件事的不同語法表示將需要很長時間。列索引? – MattH 2010-02-11 15:52:52

回答

25

您可以使用SIMILAR TO並分離與標籤|管'555123%|555321%|555987%'

如:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%' 
+1

這幾乎是我一直在尋找的,謝謝!適用於我所需要的。 – 2010-02-11 20:46:18

1

也許,如果你的前綴都是相同的長度,那麼你可以做where RIGHT(number) in ('123456', '234456', 'etc', 'etc')

2

我不這麼認爲,但你可以在桌子上criteria包含要匹配的值加入phonenumbers,即

JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers 

...大概不值得爲少數的情況下,雖然

+0

其實我確實有更多的搜索,但認爲我應該保持簡單,只有幾個數字。 – 2010-02-11 15:47:39

3

假設所有的數字不包含字母:

SELECT number 
FROM (
     VALUES 
     ('555123'), 
     ('555321'), 
     ('555000') 
     ) prefixes (prefix) 
JOIN phonenumbers 
ON  number >= prefix 
     AND number < prefix || 'a' 

如果有這將使用一個索引上phonenumbers

+0

我已經看到來自您的用戶的非常好的查詢,您從哪裏瞭解到這些內容?有沒有涵蓋所有這些的書? – Pentium10 2010-02-11 16:13:49

+0

@ Pentium10:12年來,我一直在爲此工作。我從來沒有見過一本關於數據庫內部的好書,但幾乎所有這些我都認識到了。 – Quassnoi 2010-02-11 16:19:00

+0

你有博客或有意寫一本關於這些書的書嗎?我會成爲買家之一。 – Pentium10 2010-02-11 16:19:44

0

您還可以依賴POSIX正則表達式,請參見official documentation的第9.7.3節。

例如:

SELECT * FROM foobar WHERE name ~ '12345|34567'; 

請注意,您name領域是一個字符串類型是很重要的。

13

遲到了,但是對於繁榮......你也可以使用一個ANY(array expression)

SELECT * 
FROM phonenumbers 
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%'])