-- 获取字符串字节数 (按字节计算)
SELECT LENGTH('Hello'); -- MySQL/PG: 5
SELECT LEN('Hello'); -- SQL Server: 5
-- 获取字符数 (按字符计算)
SELECT CHAR_LENGTH('Hello'); -- 5
SELECT LENGTH('你好'); -- MySQL: 6 (UTF-8编码)
SELECT CHAR_LENGTH('你好'); -- 2
-- 返回表达式使用的字节数
SELECT DATALENGTH('Hello'); -- 5
SELECT DATALENGTH(N'Hello'); -- SQL Server Unicode: 10
SELECT UPPER('hello world'); -- 'HELLO WORLD'
SELECT UCASE('hello world'); -- MySQL: 'HELLO WORLD'
SELECT LOWER('HELLO WORLD'); -- 'hello world'
SELECT LCASE('HELLO WORLD'); -- MySQL: 'hello world'
-- 基本语法:SUBSTRING(string, start, length)
SELECT SUBSTRING('Hello World', 1, 5); -- 'Hello'
SELECT SUBSTRING('Hello World', 7, 5); -- 'World'
-- MySQL/PG: 支持负数从末尾开始
SELECT SUBSTRING('Hello World', -5, 5); -- 'World'
-- 简写形式
SELECT SUBSTR('Hello World', 7); -- 'World'
SELECT LEFT('Hello World', 5); -- 'Hello'
SELECT RIGHT('Hello World', 5); -- 'World'
-- 连接多个字符串
SELECT CONCAT('Hello', ' ', 'World'); -- 'Hello World'
-- MySQL: CONCAT_WS (带分隔符)
SELECT CONCAT_WS(', ', 'John', 'Doe', 'Jr'); -- 'John, Doe, Jr'
-- SQL Server: + 运算符
SELECT 'Hello' + ' ' + 'World'; -- 'Hello World'
-- SQL Server
SELECT CHARINDEX('World', 'Hello World'); -- 7
-- MySQL
SELECT INSTR('Hello World', 'World'); -- 7
SELECT LOCATE('World', 'Hello World'); -- 7
-- PostgreSQL / 标准SQL
SELECT POSITION('World' IN 'Hello World'); -- 7
-- 支持模式匹配
SELECT PATINDEX('%orl%', 'Hello World'); -- 8
SELECT REPLACE('Hello World', 'World', 'SQL'); -- 'Hello SQL'
SELECT REPLACE('aaa', 'a', 'b'); -- 'bbb'
-- 替换字符串的一部分
SELECT STUFF('Hello World', 7, 5, 'SQL'); -- 'Hello SQL'
-- 参数:原字符串,开始位置,要替换的长度,新字符串
-- 标准SQL
SELECT TRIM(' Hello World '); -- 'Hello World'
SELECT TRIM(LEADING ' ' FROM ' Hello'); -- 'Hello'
SELECT TRIM(TRAILING ' ' FROM 'Hello '); -- 'Hello'
SELECT TRIM(BOTH ' ' FROM ' Hello '); -- 'Hello'
-- 数据库特定
SELECT LTRIM(' Hello'); -- 'Hello' (去左空格)
SELECT RTRIM('Hello '); -- 'Hello' (去右空格)
-- MySQL/Oracle
SELECT LPAD('123', 5, '0'); -- '00123'
SELECT RPAD('123', 5, '0'); -- '12300'
-- SQL Server (使用RIGHT/LEFT+REPLICATE)
SELECT RIGHT('00000' + '123', 5); -- '00123'
SELECT LEFT('123' + REPLICATE('0', 5), 5); -- '12300'
-- SQL Server
SELECT REPLICATE('Hello', 3); -- 'HelloHelloHello'
-- MySQL
SELECT REPEAT('Hello', 3); -- 'HelloHelloHello'
SELECT REVERSE('Hello'); -- 'olleH'
-- 字符与ASCII码转换
SELECT ASCII('A'); -- 65
SELECT CHAR(65); -- 'A' (SQL Server)
SELECT CHR(65); -- 'A' (PG/MySQL)
SELECT value FROM STRING_SPLIT('apple,banana,orange', ',');
-- 返回三行:apple, banana, orange
-- SQL Server
SELECT STRING_AGG(name, ', ') FROM users GROUP BY department_id;
-- MySQL
SELECT GROUP_CONCAT(name SEPARATOR ', ') FROM users GROUP BY department_id;
-- PostgreSQL
SELECT STRING_AGG(name, ', ') FROM users GROUP BY department_id;
-- 格式化字符串
SELECT FORMAT(123456789, 'N'); -- '123,456,789.00'
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd'); -- '2024-01-15'
-- 语音相似度 (SQL Server)
SELECT SOUNDEX('Smith'), SOUNDEX('Smythe'); -- S530, S530
SELECT DIFFERENCE('Smith', 'Smythe'); -- 4 (0-4,越大越相似)
-- 添加分隔符
SELECT QUOTENAME('table_name'); -- '[table_name]'
SELECT QUOTENAME('table_name', '"'); -- '"table_name"'
-- 在LIKE中处理特殊字符
SELECT * FROM products
WHERE name LIKE '%100\% discount%' ESCAPE '\';
-- MySQL 5.7+/PG 9.4+/SQL Server 2016+
SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name');
SELECT JSON_VALUE('{"name": "John", "age": 30}', '$.name');
| 函数 | MySQL | SQL Server | PostgreSQL | Oracle |
|---|---|---|---|---|
| 长度 | LENGTH() |
LEN() |
LENGTH() |
LENGTH() |
| 字符数 | CHAR_LENGTH() |
- | CHAR_LENGTH() |
LENGTH() |
| 位置查找 | INSTR() |
CHARINDEX() |
POSITION() |
INSTR() |
| 提取子串 | SUBSTRING() |
SUBSTRING() |
SUBSTRING() |
SUBSTR() |
| 连接 | CONCAT() |
+ 或 CONCAT() |
|| 或 CONCAT() |
|| 或 CONCAT() |
| 去空格 | TRIM() |
TRIM() |
TRIM() |
TRIM() |
| 重复 | REPEAT() |
REPLICATE() |
REPEAT() |
RPAD() |
| 反转 | REVERSE() |
REVERSE() |
REVERSE() |
- |
-- 1. 提取邮箱域名
SELECT SUBSTRING(email, CHARINDEX('@', email) + 1, LEN(email)) AS domain
FROM users;
-- 2. 格式化电话号码
SELECT
CASE
WHEN LEN(phone) = 10 THEN
'(' + SUBSTRING(phone, 1, 3) + ') ' +
SUBSTRING(phone, 4, 3) + '-' +
SUBSTRING(phone, 7, 4)
ELSE phone
END AS formatted_phone
FROM contacts;
-- 3. 分割逗号分隔的值
-- SQL Server
SELECT value
FROM STRING_SPLIT('red,green,blue', ',');
-- MySQL (需要自定义函数或临时表)
-- 4. 清洗数据:移除多余空格和换行符
SELECT TRIM(REPLACE(REPLACE(column, CHAR(13), ''), CHAR(10), ''))
FROM table;
-- 5. 生成固定长度的ID
SELECT RIGHT('00000' + CAST(id AS VARCHAR), 6) AS padded_id
FROM items;
掌握这些字符串函数能极大提高数据处理效率和灵活性。