#regex #string #sqlite #openstreetmap #spatialite
#регулярное выражение #строка #sqlite #openstreetmap #пространственный
Вопрос:
У меня есть база данных Spatialite, и я импортировал данные OSM в эту базу данных. С помощью следующего запроса я получаю все автомагистрали:
SELECT * FROM lines
WHERE other_tags GLOB '*A [0-9]*'
AND highway='motorway'
Я использую GLOB '*A [0-9]*'
здесь, потому что в Германии каждый автобан начинается с A, за которым следует число (например, 73).
Существует столбец с именем other_tags
, содержащий информацию о части автомагистрали:
"bdouble"=>"yes","hazmat"=>"designated","lanes"=>"2","maxspeed"=>"none","oneway"=>"yes","ref"=>"A 73","width"=>"7"
Если вы посмотрите поближе, там есть часть "ref"=>"A 73"
.
Я хочу извлечь A 73
в качестве названия автомагистрали.
Как я могу это сделать в sqlite?
Ответ №1:
Если формат не меняется, это означает, что вы можете ожидать, что other_tags
поле будет примерно таким %"ref"=>"A 73","width"=>"7"%
, тогда вы можете использовать instr
и substr
(обратите внимание, что 8 — это длина "ref"=>"
):
SELECT substr(other_tags,
instr(other_tags, '"ref"=>"') 8,
instr(other_tags, '","width"') - 8 - instr(other_tags, '"ref"=>"')) name
FROM lines
WHERE other_tags GLOB '*A [0-9]*'
AND highway='motorway'
Результатом будет
name
A 73
Ответ №2:
Проверьте со следующим условием..
other_tags like A%
— Начинается с ‘A’.abs(substr(other_tags, 3,2)) <> 0.0
— Подстрока из 3-го символа, два символа — это число.length(other_tags) = 4
— длинаother_tags
равна 4
Итак, вот каким должен быть ваш запрос:
SELECT *
FROM lines
WHERE other_tags LIKE 'A%'
AND abs(substr(other_tags, 3,2)) <> 0.0
AND length(other_tags) = 4
AND highway = 'motorway'