【问题标题】:SQLite extract string from text in columnSQLite 从列中的文本中提取字符串
【发布时间】:2016-10-19 14:18:48
【问题描述】:

我有一个 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 中做到这一点?

【问题讨论】:

    标签: regex string sqlite openstreetmap spatialite


    【解决方案1】:

    如果格式没有改变,这意味着你可以期望other_tags字段类似于%"ref"=>"A 73","width"=>"7"%,那么你可以使用instrsubstr(注意8是@的长度987654325@):

    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. 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'
      

      【讨论】:

        猜你喜欢
        • 2021-03-07
        • 2019-02-08
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多