SQLite извлекает строку из текста в столбце

#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:

Проверьте со следующим условием..

  1. other_tags like A% — Начинается с ‘A’.
  2. abs(substr(other_tags, 3,2)) <> 0.0 — Подстрока из 3-го символа, два символа — это число.
  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'