tags:

views:

96

answers:

4

Hey my first question on SO! Anywho...

Still relatively a newb at SQL so I think I might be missing something here. My question is I currently have a table full of phone numbers. I want to have a query where I search for phone numbers that are similar to a list I have. So for example, I want to find phone numbers that begin with '555123', '555321', and '555987'. I know normally if you have a list of numbers you could just do a query such as

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

Is there a way to do this with like? Such as

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

Instead of have to do this individually

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

Or is there an easier to do this that I'm just missing? I'm using postgres, I don't know if there's any commands it has that would help out with that. Thanks!

+1  A: 

Maybe if your prefixes are all the same length then you can do where RIGHT(number) in ('123456', '234456', 'etc', 'etc')

flybywire
+1  A: 

I don't think so, but you could join phonenumbers on a table criteria containing the values you want to match on, i.e.

JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers

...probably not worth it for a small number of conditions, though

toasteroven
Actually I do have a lot more to search but thought I should keep it simple with just a few numbers.
The Jug
+2  A: 

You can use SIMILAR TO and separate the tags with | pipe '555123%|555321%|555987%'

eg:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%'
Pentium10
This was pretty much what I was looking for, thanks! Works for what I need.
The Jug
+1  A: 

Assuming all your numbers do not contain letters:

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

This will use an index on phonenumbers, if any.

Quassnoi
I've seen very good queries from your user, where did you learnt the stuff? Is there a book that covers all of these?
Pentium10
@Pentium10: I've been making my living out of it for `12` years. I've never seen a good book on database internals (yet), almost all of this I've figured myself.
Quassnoi
Do you have a blog or intentions to write a book about these? I would be among the buyers.
Pentium10
@Pentium10: http://explainextended.com The book is in progress, but this is a secret yet, please don't tell anybody.
Quassnoi