【问题标题】:Find and ST_JOIN all objects where names that starts with the same first two words查找并 ST_JOIN 名称以相同的前两个单词开头的所有对象
【发布时间】:2022-01-08 17:16:32
【问题描述】:

我有一张带有多边形的表,如果名称属性以相同的两个单词开头,我想将其合并到一个多边形中。

ANGELHOLM TMA SECTOR KLIPPAN,

ANGELHOLM TMA 部门 LAHOLM,

安卡拉 TMA,安卡拉 TMA 下层,

安卡拉 TMA 上层,

安塔利亚APP CARDAK UPPER SECTOR,

安塔利亚APP东中部,

安塔利亚APP东中部,

安塔利亚APP东区-,

安塔利亚APP北区,

安塔利亚 APP 东南 LOWER SE,

安塔利亚 APP SOUTHWEST LOWER SE,

安塔利亚应用程序西部中部,

安塔利亚应用程序西部上层-,

塔那那利佛TMA,

塔那那利佛TMA

即我想对所有以 “ANTALAYA TMA%”到一个多边形,

ANKARA TMA% 到一个多边形,

ANGELHOLM TMA% 到一个多边形,

ANTALYA APP% 到一个多边形,

ANTANANARIVO TMA% 到一个多边形

等等

问题是我不想硬编码,即“ANKARA TMA%”,因为表中有数千个对象/名称。 我想在一个查询中与名称中我不知道的前两个单词进行比较,然后将它们 ST_JOIN 连接在一起。

是否可以在 SQL 中做到这一点?

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    您可以使用带有regular expressionsubstring() 函数来提取“tmaName”字符串的前两个单词。因为ST_UNION() 是一个聚合函数,你可以试试这样的:

    SELECT substring(t1."tmaName" from '^[^\s]+\s[^\s]+') AS icaoCode
         , ST_MULTI(ST_UNION(ST_SnapToGrid(t1.the_geom, 0.000001))) AS geom
      FROM "TMA" AS t1
     GROUP BY substring(t1."tmaName" from '^[^\s]+\s[^\s]+')
    

    正则表达式 '^[^\s]+\s[^\s]+' 选择前两组字符,它们不是由一个空格字符分隔的空格,请参阅manual

    【讨论】:

    • 这是我手动操作的方法: INSERT INTO "TMA" ("the_geom", "FACC_CODE") VALUES ((SELECT ST_MULTI(ST_UNION(ST_SnapToGrid(the_geom, 0.000001))) AS geom FROM " TMA" WHERE "tmaName" ILIKE 'Friedrichshafen SECTOR A' OR "tmaName" ILIKE 'Friedrichshafen SECTOR B') ,'GA005');
    • 这就是我尝试过的: INSERT INTO "TMA" ("the_geom", "FACC_CODE") Values ((SELECT ST_MULTI(ST_UNION(ST_SnapToGrid(t1.the_geom, 0.000001))) AS geom FROM "TMA" AS t1 INNER JOIN "TMA" AS t2 ON substring(t1."tmaName" from '^\w\s\w') = substring(t2."tmaName" from '^\w\s\w') AND t1."tmaName" t2."tmaName" ), 'GA005');仅插入一个空(所有属性)行。我在 snapToGrid 中插入了“t1.”the_geom 而不是 the_geom,因为 the_geom 不明确。
    • @Paul - 我更新了不符合您期望的答案,因为它只是比较了两行与相同的前两个单词。更新后的答案将共享相同的前两个单词的所有行分组,它应该像ST_UNION 一样工作,听起来像aggregate function,但我从未使用过 postgist,因此您必须测试和调整建议的解决方案以使它工作。
    • 我试过这个:INSERT INTO "TMA" ("the_geom", "icaoCode") Values ((SELECT substring(t1."tmaName" from '^\w\s\w') AS first_key_words , ST_MULTI(ST_UNION(ST_SnapToGrid(t1.the_geom, 0.000001))) AS geom FROM "TMA" AS t1 GROUP BY substring(t1."tmaName" from '^\w\s\w')), 'GA005') 但是出现错误:错误:子问题只能返回 1 列第 3 行:(SELECT substring(t1."tmaName" from '^\w\s\w') AS first_k...
    • SELECT 子句中删除substring(t1."tmaName" from '^\w\s\w') AS 2_first_key_words,这仅用于测试目的,而不是让您在INSERT 语句中进行复制/粘贴。并首先单独测试 SELECT 语句,然后再将其嵌入到 INSERT 语句中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多