如何用SQL从URL字段中提取域名?
用SQL直接提取URL中的域名
当然可以直接用SQL实现域名提取,不同数据库的函数语法略有差异,下面针对常用数据库给出具体方案:
MySQL/MariaDB
利用SUBSTRING_INDEX函数按指定分隔符截取字符串,针对你给出的示例(域名后直接跟/),可以直接取第一个/之前的内容:
SELECT id, SUBSTRING_INDEX(URL, '/', 1) AS domain FROM your_table;
如果后续遇到带http://或https://前缀的URL,先剥离前缀再截取:
SELECT id, SUBSTRING_INDEX( SUBSTRING_INDEX(URL, '://', -1), '/', 1 ) AS domain FROM your_table;
PostgreSQL
可以用split_part拆分字符串,或结合正则处理复杂场景:
- 针对无前缀的URL:
SELECT id, split_part(URL, '/', 1) AS domain FROM your_table;
- 兼容带
http/https前缀的URL,用正则捕获域名部分:
SELECT id, substring(URL from '^(https?://)?([^/]+)', 2) AS domain FROM your_table;
这段正则会忽略可选的http:///https://前缀,直接提取第一个/前的域名部分。
SQL Server
通过CHARINDEX定位分隔符位置,再用SUBSTRING截取内容:
针对无前缀的URL:
SELECT id, SUBSTRING(URL, 1, CHARINDEX('/', URL) - 1) AS domain FROM your_table WHERE CHARINDEX('/', URL) > 0;
如果要处理带前缀的URL,先剥离前缀再截取:
SELECT id, SUBSTRING( CASE WHEN CHARINDEX('://', URL) > 0 THEN SUBSTRING(URL, CHARINDEX('://', URL) + 3, LEN(URL)) ELSE URL END, 1, CHARINDEX('/', CASE WHEN CHARINDEX('://', URL) > 0 THEN SUBSTRING(URL, CHARINDEX('://', URL) + 3, LEN(URL)) ELSE URL END) - 1 ) AS domain FROM your_table WHERE CHARINDEX('/', URL) > 0;
补充说明
如果存在URL末尾没有/的情况(比如直接是nytimes.com),需要添加判断逻辑避免报错。例如MySQL中可调整为:
SELECT id, CASE WHEN CHARINDEX('/', URL) > 0 THEN SUBSTRING_INDEX(URL, '/', 1) ELSE URL END AS domain FROM your_table;
内容的提问来源于stack exchange,提问作者Prabin
相关产品推荐
相关产品推荐

