You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中筛选符合特定路径规则的URL?

筛选有路径URL的SQL实现方案(无需正则也能高效搞定)

嘿,先把你的需求理清楚:你要区分两种URL——无路径的是结尾只有/,或者最后一段是带扩展名(比如.html)的;有路径的是最后一段是纯字母数字(不管后面有没有加/)的多级或单级路径。

既然你担心正则在SQL里的性能问题,那咱们用字符串函数来实现,比正则更高效,而且大部分SQL引擎都支持:

核心判断逻辑

  1. 排除掉仅以单个/结尾的URL(比如stackoverflow.com/)
  2. 排除掉最后一段包含小数点的URL(比如abc.html这种带扩展名的)
  3. 剩下的就是符合要求的“有路径”URL

MySQL 实现代码

SELECT url
FROM your_table
WHERE 
  -- 排除仅以/结尾的情况
  TRIM(TRAILING '/' FROM url) != url
  AND
  -- 最后一段(去掉结尾的/之后)不包含小数点
  INSTR(REVERSE(SUBSTRING_INDEX(TRIM(TRAILING '/' FROM url), '/', -1)), '.') = 0;

简单解释下:

  • TRIM(TRAILING '/' FROM url) 会把URL结尾的所有斜杠去掉,比如stackoverflow.com/abc/bla/会变成stackoverflow.com/abc/bla
  • SUBSTRING_INDEX(..., '/', -1) 取去掉斜杠后的最后一段内容,上面的例子就是bla
  • 反转这段内容后用INSTR找小数点,如果找不到(返回0),说明这段没有扩展名,符合要求

SQL Server 实现代码

SELECT url
FROM your_table
WHERE
  -- 排除仅以/结尾的情况
  NOT (url LIKE '%/' AND LEN(TRIM(TRAILING '/' FROM url)) = LEN(url) - 1)
  AND
  -- 最后一段不包含小数点
  CHARINDEX('.', REVERSE(PARSENAME(REPLACE(TRIM(TRAILING '/' FROM url), '/', '.'), 1))) = 0;

这里用REPLACE把斜杠换成点,然后用PARSENAME来取最后一段,再检查有没有小数点,逻辑和MySQL类似。

PostgreSQL 实现代码

SELECT url
FROM your_table
WHERE
  -- 排除仅以/结尾的情况
  url NOT LIKE '%/' OR LENGTH(TRIM(TRAILING '/' FROM url)) != 0
  AND
  -- 最后一段不包含小数点
  POSITION('.' IN REVERSE(SPLIT_PART(TRIM(TRAILING '/' FROM url), '/', -1))) = 0;

用SPLIT_PART直接按斜杠分割取最后一段,再检查小数点,非常直观。


要是你觉得正则更简单(数据量小的时候用)

如果你的数据量不大,正则的性能问题可以忽略,给你适配不同引擎的正则写法:

  • MySQL:
SELECT url
FROM your_table
WHERE url REGEXP '\/\w+$|\/\w+\/$';
  • SQL Server:
SELECT url
FROM your_table
WHERE url LIKE '%/[a-zA-Z0-9]$' OR url LIKE '%/[a-zA-Z0-9]/$';
  • PostgreSQL:
SELECT url
FROM your_table
WHERE url ~ '\/\w+$|\/\w+\/$';

这个正则匹配两种情况:要么以/+字母数字结尾,要么以/+字母数字+/结尾,刚好符合你要的“有路径”规则。


内容的提问来源于stack exchange,提问作者asaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:11