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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:00:11