如何在PostgreSQL中引用OSM复合hstore键的第一部分?
解决方案:PostgreSQL HStore筛选以指定前缀开头的键
问题背景
PostgreSQL表m_temp.osm_road的tags列为hstore类型,存储OSM标签(如oneway:bicycle => 'yes'、oneway => 'true')。需要筛选所有键以oneway开头的记录,同时能获取对应键的值。
可行方案
1. 筛选符合条件的记录
使用akeys()函数提取hstore的所有键,结合LIKE ANY匹配前缀,这是最直接且性能较好的方式:
SELECT * FROM m_temp.osm_road WHERE 'oneway%' LIKE ANY (akeys(tags));
这个语句会匹配所有包含oneway或oneway:xxx这类键的记录,完全覆盖需求。
2. 提取对应键的键值对
如果需要同时获取这些以oneway开头的键及其对应的值,可以用each()函数结合LATERAL展开hstore,再过滤键的前缀:
SELECT t.*, kv.key AS oneway_key, kv.value AS oneway_value FROM m_temp.osm_road t, LATERAL each(t.tags) kv WHERE kv.key LIKE 'oneway%';
这样每条符合条件的键值对都会单独成一行,方便后续处理。
3. 修正正则表达式方案(不推荐)
如果坚持用正则,需要调整匹配规则以覆盖纯oneway的情况,但这种方式需要把hstore转成文本,性能不如原生函数:
SELECT * FROM m_temp.osm_road WHERE tags::text ~ 'oneway(:|$)';
这里(:|$)表示匹配冒号或者字符串结尾,既匹配oneway:开头的键,也匹配单独的oneway键。
内容的提问来源于stack exchange,提问作者588chm
相关产品推荐
相关产品推荐

