SQL - 组合多个类似的查询

时间:2010-02-11 15:37:32

标签: sql postgresql

嘿我关于SO的第一个问题! Anywho ...

在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,我不知道是否有任何命令可以帮助解决这个问题。谢谢!

6 个答案:

答案 0 :(得分:33)

您可以使用SIMILAR TO并将标记与|分开管'555123%|555321%|555987%'

例如:

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

答案 1 :(得分:22)

晚会,但对于后代......你也可以使用ANY(array expression)

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

答案 2 :(得分:6)

假设您的所有号码都不包含字母,并且您的号码始终为“前缀”(例如:LIKE '123%'):

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

这将使用phonenumbers上的索引(如果有的话),因此可能更快。

答案 3 :(得分:3)

我不这么认为,但您可以将phonenumbers加入包含您想要匹配的值的表criteria,即

JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers

......虽然

可能不适合少数条件

答案 4 :(得分:1)

如果你的前缀长度相同,那么你可以where RIGHT(number) in ('123456', '234456', 'etc', 'etc')

答案 5 :(得分:0)

您还可以依赖POSIX正则表达式,请参阅official documentation的第9.7.3节。

例如:

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

请务必注意,您的name字段属于字符串类型。