如何使PostgreSQL查询仅返回包含A-Z与0-9字符的结果?
解决PostgreSQL筛选仅含A-Z和0-9字符的结果问题
嘿,这个需求很好实现!PostgreSQL的正则表达式匹配功能正好能帮你精准筛选出符合要求的结果,我给你几种常用的写法:
1. 严格匹配大写字母(A-Z)和数字(0-9)
如果你的需求是只允许大写字母和数字,可以用这个查询:
SELECT name FROM table WHERE name ~ '^[A-Z0-9]+$';
~是PostgreSQL中区分大小写的正则匹配操作符^和$分别匹配字符串的开头和结尾,确保整个name字段都符合规则,而不是部分字符符合[A-Z0-9]表示匹配任意一个大写字母或数字+表示前面的字符组至少出现一次,避免匹配空字符串
2. 不区分大小写匹配字母(A-Z/a-z)和数字(0-9)
如果需要同时支持大小写字母,只需要把匹配操作符换成~*(不区分大小写):
SELECT name FROM table WHERE name ~* '^[A-Z0-9]+$';
这样不管name里是大写还是小写字母,都会被匹配到。
3. 使用POSIX字符类简化写法
PostgreSQL支持POSIX字符类,用[:alnum:]可以直接匹配任意字母(大小写)和数字,写法更简洁:
SELECT name FROM table WHERE name ~ '^[[:alnum:]]+$';
如果要严格限定大写字母和数字,也可以组合字符类:
SELECT name FROM table WHERE name ~ '^[[:upper:][:digit:]]+$';
补充说明
- 如果
name字段可能存在NULL值,上面的条件会自动排除这些记录,因为NULL和正则表达式匹配的结果是NULL,不会被WHERE子句选中。 - 如果需要允许空字符串,可以把
+换成*,不过通常业务场景下应该不需要这个。
内容的提问来源于stack exchange,提问作者Devil's Dream




