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

У меня есть база данных Spatialite, и я импортировал данные OSM в эту базу данных. С помощью следующего запроса я получаю все автомагистрали:

SELECT * FROM lines 
    WHERE other_tags GLOB '*A [0-9]*'
    AND highway='motorway'

Здесь я использую GLOB '*A [0-9]*', потому что в Германии каждый автобан начинается с буквы A, за которой следует номер (например, 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?


person Stefan    schedule 19.10.2016    source источник


Ответы (2)


Если формат не меняется, это означает, что вы можете ожидать, что поле 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
person antonio    schedule 21.10.2016

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

  1. other_tags like A% -- Начните с буквы «А».
  2. 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'
person PlusInfosys    schedule 20.10.2016