PostgreSQL中如何从网址URL提取域名部分的首个单词
PostgreSQL提取网址核心词的正确实现
你原来的代码存在两个明显问题:
SPLIT_PART函数的分段位置计数从1开始,传入0会返回空值,无法获取有效分段- 硬编码替换协议、
www.前缀的逻辑兼容性极差,遇到不带www.的域名、带路径/端口的地址、其他子域名前缀时会直接匹配错误
更稳妥的实现方式是直接通过正则捕获目标内容,不需要先替换再拆分,一步即可兼容绝大多数常见网址格式:
-- 测试验证不同格式的网址提取效果 WITH test_urls AS ( SELECT unnest(ARRAY[ 'https://www.happy.com', 'http://happy.com', 'https://www.happy.com/path/to/page?id=1', 'https://happy.cn:8080/api/list', 'http://www.happy.co.uk' ]) AS url ) SELECT url, SUBSTRING(url FROM 'https?://(?:www\.)?([^./:]+)') AS target_word FROM test_urls;
正则逻辑说明
https?://:匹配http://或https://协议头(?:www\.)?:可选匹配www.前缀,该部分为非捕获组,不会计入最终提取结果([^./:]+):捕获连续的非.、非/、非:字符,遇到域名分隔点、路径斜杠、端口冒号就自动停止匹配,正好提取出需要的核心词
如果你的网址存在m.、api.这类其他固定子域名前缀,只需要修改正则里的前缀匹配部分即可,比如改成(?:www\.|m\.|api\.)?就能覆盖对应场景。
内容的提问来源于stack exchange,提问作者Gordan84
相关产品推荐
相关产品推荐

