SQL查询:筛选名字首字母为M或姓氏倒数第二位为i的用户
正确的SQL查询脚本
核心问题在于原查询的%i_会匹配整个姓名字符串的倒数第二位为i的情况,我们需要限定为姓氏(空格后的部分)的倒数第二位为i。以下是基于不同数据库的实现方案,假设姓名格式为「名 + 单个空格 + 姓」:
通用严谨方案(适配多数数据库)
先拆分出姓氏部分,再判断其倒数第二位是否为i,同时保留名字首字母为M的条件:
MySQL/MariaDB
SELECT * FROM 你的表名 WHERE CLIENT LIKE 'M%' OR ( LENGTH(SUBSTRING_INDEX(CLIENT, ' ', -1)) >= 2 AND SUBSTRING(SUBSTRING_INDEX(CLIENT, ' ', -1), LENGTH(SUBSTRING_INDEX(CLIENT, ' ', -1)) - 1, 1) = 'i' );
SUBSTRING_INDEX(CLIENT, ' ', -1):提取空格后的姓氏部分LENGTH(...) >=2:确保姓氏长度至少为2,避免不存在倒数第二位的无效数据SUBSTRING(..., LENGTH(...) -1, 1):精准提取姓氏的倒数第二位字符并判断是否等于i
SQL Server
SELECT * FROM 你的表名 WHERE CLIENT LIKE 'M%' OR ( LEN(RIGHT(CLIENT, CHARINDEX(' ', REVERSE(CLIENT)) - 1)) >= 2 AND SUBSTRING(RIGHT(CLIENT, CHARINDEX(' ', REVERSE(CLIENT)) - 1), LEN(RIGHT(CLIENT, CHARINDEX(' ', REVERSE(CLIENT)) - 1)) - 1, 1) = 'i' );
REVERSE(CLIENT):反转字符串后找到第一个空格的位置,以此确定姓氏的起始位置RIGHT(CLIENT, CHARINDEX(' ', REVERSE(CLIENT)) -1):提取出完整的姓氏部分
PostgreSQL
SELECT * FROM 你的表名 WHERE CLIENT LIKE 'M%' OR ( LENGTH(SPLIT_PART(CLIENT, ' ', 2)) >= 2 AND SUBSTRING(SPLIT_PART(CLIENT, ' ', 2), LENGTH(SPLIT_PART(CLIENT, ' ', 2)) -1, 1) = 'i' );
SPLIT_PART(CLIENT, ' ', 2):按空格拆分姓名,直接取第二部分作为姓氏
简化写法(适用于格式规范的场景)
如果可以确定所有姓名都只有一个空格分隔名和姓,且姓氏长度至少为2,可使用更简洁的模糊匹配:
SELECT * FROM 你的表名 WHERE CLIENT LIKE 'M%' OR CLIENT LIKE '% i_';
% i_:匹配「任意内容 + 空格 + 字母i + 任意单个字母」,精准限定姓氏的倒数第二位为i
内容的提问来源于stack exchange,提问作者munano
相关产品推荐
相关产品推荐

