含前导零IP地址的SQL精准查询问题求助
解决IP地址前导零的精准匹配问题
我明白你遇到的痛点:数据库里的IP有的带前导零(比如012.12.012.12),有的不带(12.12.12.12),想用模糊查询匹配所有四段是12或012的IP,但要么误匹配,要么查不到结果。下面给你几个靠谱的解决方案:
方案1:用正则表达式(最简洁高效)
正则能精准控制每个IP段的匹配规则,直接指定每个段要么是12,要么是012,同时确保整个IP严格符合四段格式:
MySQL/MariaDB 写法:
WHERE ip REGEXP '^(0?12)\\.(0?12)\\.(0?12)\\.(0?12)$'
^和$锁定字符串首尾,避免匹配到类似112.012.112.012这种包含12但不是纯段的IP0?12表示“可选的1个0,加上必有的12”,完美覆盖12和012两种情况\\.是转义后的点,因为正则里.默认匹配任意字符,必须转义才能匹配IP里的分隔点
PostgreSQL 写法:
WHERE ip ~ '^(0?12)\.(0?12)\.(0?12)\.(0?12)$'
SQL Server 写法(2016+支持正则):
WHERE ip REGEXP '^(0?12)\.(0?12)\.(0?12)\.(0?12)$'
如果是旧版SQL Server,也可以用通配符写法:
WHERE ip LIKE '[0]?12.[0]?12.[0]?12.[0]?12'
方案2:用LIKE枚举所有可能(兼容性拉满)
如果你的数据库不支持正则,也可以直接枚举所有符合条件的IP组合,虽然繁琐但绝对不会出错:
WHERE ip IN ( '12.12.12.12', '012.12.12.12', '12.012.12.12', '12.12.012.12', '12.12.12.012', '012.012.12.12', '012.12.012.12', '012.12.12.012', '12.012.012.12', '12.012.12.012', '12.12.012.012', '012.012.012.12', '012.012.12.012', '012.12.012.012', '012.012.012.012' )
为什么你的原有方法行不通?
- 第一个查询
WHERE ip LIKE '%12.%12.%12.%.12':%会匹配任意字符,包括112里的前缀1,所以会误匹配112.012.112.012这种不符合要求的IP。 - 第二个查询
WHERE ip LIKE '[0]%12.[0]%12.[0]%12.[0]%.12':[0]%12的意思是“一个0,后面跟任意字符,再跟12”,这不仅要求每个段必须以0开头,还允许0和12之间有其他字符(比如0abc12),同时完全排除了不带前导零的12段,自然查不到结果。
内容的提问来源于stack exchange,提问作者MacNean Tyrrell
相关产品推荐
相关产品推荐

