基于Oracle HR Schema的SQL查询:统计员工姓氏首'e/E'前字符数
针对Oracle HR Schema的字符统计解决方案
嘿,这个需求用Oracle的字符串函数就能轻松搞定,我给你整理了两种可行的写法,还考虑了旧版本兼容性:
方案一:利用Oracle 12c+的不区分大小写匹配(推荐)
如果你的Oracle版本是12c及以上,直接用INSTR函数的不区分大小写参数会更简洁:
SELECT last_name, -- 计算第一个'e'或'E'之前的字符数量 CASE -- 找到匹配字符时,返回位置减1(因为位置从1开始计数) WHEN INSTR(last_name, 'e', 1, 1, 'i') > 0 THEN INSTR(last_name, 'e', 1, 1, 'i') - 1 -- 没找到的话,返回整个姓氏的长度(毕竟所有字符都在"第一个e/E之前") ELSE LENGTH(last_name) END AS chars_before_first_e FROM employees;
关键函数解释:
INSTR(last_name, 'e', 1, 1, 'i'):这个函数会在last_name里从第1个字符开始,查找第1次出现的e,最后的'i'标记表示忽略大小写,所以E也会被匹配到。如果找到就返回该字符的位置(从1开始计数),没找到则返回0。
方案二:兼容所有Oracle版本的写法
如果你的Oracle版本比较旧(不支持INSTR的'i'参数),可以通过转换大小写来实现不区分匹配:
SELECT last_name, CASE WHEN INSTR(LOWER(last_name), 'e') > 0 THEN INSTR(LOWER(last_name), 'e') - 1 ELSE LENGTH(last_name) END AS chars_before_first_e FROM employees;
这里我们先把last_name转成小写,再查找e的位置,效果和不区分大小写完全一致,适合所有版本的Oracle。
额外小技巧:
如果你只想筛选出姓氏里包含e或E的员工,可以在查询末尾加WHERE条件:
WHERE INSTR(last_name, 'e', 1, 1, 'i') > 0 -- 对应方案一 -- 或者兼容版本:WHERE INSTR(LOWER(last_name), 'e') > 0
内容的提问来源于stack exchange,提问作者Yağız Demir
相关产品推荐
相关产品推荐

