SQL - 组合多个类似的查询

The*_*Jug 27 sql postgresql

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

在SQL上还是比较新的,所以我想我可能会遗漏一些东西.我的问题是我目前有一张满是电话号码的桌子.我想查询一下我搜索的电话号码与我的列表类似.例如,我想找到以"555123","555321"和"555987"开头的电话号码.我通常知道如果你有一个数字列表,你可以做一个查询,如

SELECT * 
  FROM phonenumbers 
 WHERE number in ('5551234567', '5559876543', .... );
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样做?如

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

而不是必须单独做这件事

SELECT * 
  FROM phonenumbers 
 WHERE number like '555123%' 
    or number like '555321%' 
    or number like '555987%'; //Which does work but takes a long time
Run Code Online (Sandbox Code Playgroud)

或者是否更容易做到这一点,我只是缺少?我正在使用postgres,我不知道是否有任何命令可以帮助解决这个问题.谢谢!

Pen*_*m10 38

您可以使用SIMILAR TO和分隔标记 管'555123%|555321%|555987%'

例如:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%'
Run Code Online (Sandbox Code Playgroud)


Ric*_*kyA 24

晚到晚会,但为了后人...你也可以使用ANY(数组表达式)

SELECT * 
FROM phonenumbers 
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%'])
Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 6

假设你的所有数字都不包含字母,而且你的数字总是"前缀"(例如:)LIKE '123%':

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

这将使用索引phonenumbers,如果有的话,可以更快.

  • @Pentium10:http://explainextended.com这本书正在进行中,但这是一个秘密,请不要告诉任何人. (2认同)