SQL分类数据正则筛选需求:主分类与子分类提取
嘿,这两个SQL查询需求不难搞定,咱们根据你给出的分类编号规则一步步来:
1. 筛选所有主分类记录
根据你的描述,主分类的sort_id是纯数字(没有小数点),而且你提到正则[0-9][0-9],说明主分类是两位数字编号。我们可以用正则精准匹配这种“纯两位数字、无小数点”的格式,不同数据库的写法如下:
- MySQL/MariaDB:
SELECT * FROM categories WHERE sort_id REGEXP '^[0-9]{2}$';
这里的^和$是锚点,确保整个sort_id就是两位数字,彻底排除带小数点的子分类。
- PostgreSQL:
PostgreSQL用~作为正则匹配运算符,写法类似:
SELECT * FROM categories WHERE sort_id ~ '^[0-9]{2}$';
- SQL Server:
可以用PATINDEX函数来匹配正则,或者用LIKE组合判断:
-- 方法1:用PATINDEX SELECT * FROM categories WHERE PATINDEX('^[0-9][0-9]$', sort_id) = 1; -- 方法2:用LIKE组合 SELECT * FROM categories WHERE sort_id LIKE '[0-9][0-9]' AND sort_id NOT LIKE '%.%';
如果你的主分类编号可能是1位或更多位数(不局限两位),只需要把正则里的[0-9]{2}改成[0-9]+,就能匹配任意位数的纯数字主分类了。
2. 根据指定主分类筛选子分类
比如要筛选主分类10的所有子分类,子分类的格式是主分类编号.子分类编号,我们需要匹配以10.开头的sort_id:
- MySQL/MariaDB:
SELECT * FROM categories WHERE sort_id REGEXP '^10\.[0-9]+$';
^10\.确保以10.开头,[0-9]+$表示后面跟着至少一位数字直到结尾,这样就能精准匹配该主分类的直接子分类。如果需要包含多级子分类(比如10.10.20),可以去掉$锚点,改成^10\.。
- PostgreSQL:
SELECT * FROM categories WHERE sort_id ~ '^10\.[0-9]+$';
- SQL Server:
同样可以用PATINDEX或LIKE:
-- 方法1:用PATINDEX匹配直接子分类 SELECT * FROM categories WHERE PATINDEX('^10\.[0-9]+$', sort_id) = 1; -- 方法2:用LIKE,支持多级子分类的话去掉后面的NOT LIKE SELECT * FROM categories WHERE sort_id LIKE '10.%' AND sort_id NOT LIKE '10.%.';
内容的提问来源于stack exchange,提问作者AlexdD1979
相关产品推荐
相关产品推荐

