最好将街道存储在带有 ID 的单独表中,并将数字存储在单独的表中,每个范围或数字和街道 ID 对应一行。
例如:
streets:
ID, street
-----------
1, Albert Dr
2, Bergundy Pl
3, David Ln
4, Garfield Av
...
houses:
street_id, house_min, house_max
-----------------
1, 4116, 4230
1, 4510, 4510
1, 4513, 4516
2, 1300, 1300
2, 1340, 1450
...
在没有范围但只有一个门牌号的行中,您将最小值和最大值设置为相同的值。
您可以编写一个脚本,该脚本将解析您的 txt 文件并将所有数据保存到 db。这应该像几个循环和具有不同参数的explode() 和一些插入查询一样简单。
然后通过第一个查询,您将获得街道 ID
SELECT id FROM streets WHERE street LIKE '%[street name]%'
之后你运行第二个查询并得到答案,那条街上是否有这样的门牌号
SELECT COUNT(*)
FROM houses
WHERE street_id = [street_id]
AND [house_num] BETWEEN house_min AND house_max
在 [...] 中,您输入真实值,不要忘记转义它们以防止 sql 注入...
或者您甚至可以使用 JOIN 只运行一个查询。
此外,您应该确保您给定的门牌号码是整数,而不是浮点数。