您可以通过获取 via 的前 4 个字符来执行此ORDER BY CASE
操作:phone_number
LEFT(phone_number, 4)
SELECT
phone_number
FROM yourtable
ORDER BY
CASE
/* first group of A prefixes */
WHEN LEFT(phone_number, 4) IN ('0911','other_a','another_a') THEN 1
/* first group of B prefixes */
WHEN LEFT(phone_number, 4) IN ('0905','other_b','another_b') THEN 2
/* second group of A prefixes */
WHEN LEFT(phone_number, 4) IN ('0904','some_a','someother_a') THEN 3
/* second group of B prefixes */
WHEN LEFT(phone_number, 4) IN ('0907','some_b','someother_b') THEN 4
ELSE 5
END ASC,
phone_number ASC
IN()
在我拥有的地方替换其他前缀other_a
等...。这样做是匹配前 4 个字符,如果它们在分配的排序组中,只需应用一个数字来排序。在上面的示例中,所有 0911、other_a、another_a 都将被赋予 1,因此排在 0905、other_b、another_b 和您碰巧分配的下一组 A 之前。
在这些组内,对phone_number
.
我想我从您的问题中了解到,A 和 B 的前缀比您列出的 4 个要多。如果这不正确,您可以将IN()
下面的子句替换为简单= '0904'
的示例。
不幸的是,这种方法可能对索引不是很友好。如果性能不能满足您的需求,我建议将前缀作为 a 存储CHAR(4)
在单独的列中(带有索引)并在ORDER BY
.