0

我想在此表中选择以36375不以其他开头的数字:

+-------------+
| phone       |
+-------------+
| 36000000000 |  <
| 37000000001 |
| 36000000002 |  <
| 37500000002 |  <
| 34000000002 |
| 33000000002 |
+-------------+

我试过了 :

select phone from numbers where phone in ( "36%", "375%" );

但它返回一个空集,我猜通配符%不适用于该in函数

就我而言,我有很多前缀要测试,这就是我没有使用like运算符的原因

4

2 回答 2

3

您可以通过单个正则表达式来做到这一点:

SELECT phone FROM numbers WHERE phone REGEXP '^(36*|375*)'

这仍然需要一些操作(即重新计算前缀),但比OR LIKE语法短。

现在至于索引。旧版本的 MySQL 不会在两种情况下都使用索引 - OR LIKE(因为OR)和REGEXP. 但是新版本(我在 5.5 上测试过)将在这两种情况下使用 index - 请参阅此演示。编辑:可能 OR LIKE会在旧版本的 MySQL 中使用索引,而不是REGEXP- 这还有待检查(在下面的评论中,我们发现 5.1 版本使用了索引OR LIKEREGEXP使用 5.5 的索引)

于 2013-09-10T14:59:35.150 回答
1

使用LIKE代替IN

SELECT phone FROM numbers WHERE phone LIKE "36%" OR phone LIKE "375%"
于 2013-09-10T14:57:30.373 回答