嘿我关于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,我不知道是否有任何命令可以帮助解决这个问题。谢谢!
答案 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
字段属于字符串类型。