MID() 函数用于从文本字段中提取子字符串。它可以从指定位置开始,返回指定长度的字符。
注意:不同数据库系统的函数名称可能不同:
MID() 或 SUBSTRING()SUBSTR()SUBSTR()MID(column_name, start, length)
或
SUBSTRING(column_name, start, length)
参数说明:
-- 两种写法都有效
SELECT MID('Hello World', 7, 5) AS result; -- 返回 'World'
SELECT SUBSTRING('Hello World', 7, 5); -- 返回 'World'
2. SQL Server
SELECT SUBSTRING('Hello World', 7, 5) AS result; -- 返回 'World'
3. Oracle
SELECT SUBSTR('Hello World', 7, 5) FROM dual; -- 返回 'World'
4. PostgreSQL
SELECT SUBSTRING('Hello World' FROM 7 FOR 5); -- 返回 'World'
-- 或使用 SUBSTR
SELECT SUBSTR('Hello World', 7, 5); -- 返回 'World'
-- 提取电话号码的区号(假设前3位是区号)
SELECT MID(phone_number, 1, 3) AS area_code
FROM customers;
示例2:从中间提取信息
-- 提取电子邮件地址的用户名部分(@之前的部分)
SELECT
email,
MID(email, 1, INSTR(email, '@') - 1) AS username
FROM users;
示例3:处理产品代码
-- 产品代码格式:CAT-2023-001,提取类别部分
SELECT
product_code,
MID(product_code, 1, 3) AS category
FROM products;
示例4:结合其他函数使用
-- 提取最后3个字符
SELECT
order_id,
MID(order_id, LENGTH(order_id) - 2, 3) AS last_three
FROM orders;
SELECT MID('ABCDE', 1, 1); -- 返回 'A'(不是0)
SELECT MID('ABCDE', 2, 2); -- 返回 'BC'
2. 长度参数可选
-- 不指定长度,提取到字符串末尾
SELECT MID('Hello World', 7); -- 返回 'World'
3. 处理负数位置
SELECT MID('Hello World', -5, 5); -- 返回 'World'
-- 只返回到字符串末尾
SELECT MID('Hello', 2, 10); -- 返回 'ello'
-- 移除字符串开头的空格或特定字符
SELECT MID(column_name, 2)
FROM table_name
WHERE LEFT(column_name, 1) = '#';
2. 日期/时间处理
-- 提取时间的小时部分(格式:HH:MM:SS)
SELECT
time_string,
MID(time_string, 1, 2) AS hour_part
FROM schedule;
3. 身份证信息提取
-- 提取出生日期(假设身份证号格式正确)
SELECT
id_card,
MID(id_card, 7, 8) AS birth_date
FROM persons;
4. URL解析
-- 提取域名部分
SELECT
url,
MID(url, INSTR(url, '://') + 3,
INSTR(MID(url, INSTR(url, '://') + 3), '/') - 1) AS domain
FROM website_logs;
避免在WHERE子句中直接使用MID()
-- 不推荐(无法使用索引)
SELECT * FROM users
WHERE MID(email, 1, 5) = 'admin';
-- 推荐使用LIKE(可能使用索引)
SELECT * FROM users
WHERE email LIKE 'admin%';
考虑使用持久化计算列
-- SQL Server示例
ALTER TABLE products
ADD category_code AS MID(product_code, 1, 3) PERSISTED;
为保证代码的跨数据库兼容性,建议:
使用标准SQL函数 封装数据库特定的函数 在应用程序层处理复杂字符串操作从字符串 'Database2023' 中提取 '2023'
SELECT MID('Database2023', 9, 4);
练习2:
提取文件扩展名(假设文件名格式:document.pdf)
SELECT
filename,
MID(filename, INSTR(filename, '.') + 1) AS extension
FROM files;
练习3:
格式化显示电话号码(从1234567890格式化为123-456-7890)
SELECT
phone,
CONCAT(
MID(phone, 1, 3),
'-',
MID(phone, 4, 3),
'-',
MID(phone, 7, 4)
) AS formatted_phone
FROM contacts;
MID() 函数是SQL中处理字符串的利器,特别适用于:
使用时需要注意数据库系统的差异,合理使用可以提高数据处理效率,但也要注意避免因滥用而影响查询性能。