字符串函数和操作符
文本函数用于清洗、组合和展示字符数据。以下以 PostgreSQL 为准;text 是可变长文本,函数结果的比较和大小写规则可能受排序规则影响。
连接与空值
SELECT 'Hello' || ' ' || 'SQL'; -- Hello SQL
SELECT 'Hello' || NULL; -- SQL NULL
SELECT concat('Hello', NULL, 'SQL'); -- HelloSQL
SELECT concat_ws(' ', 'Hello', NULL, 'SQL'); -- Hello SQL
|| 遇到 NULL 返回 NULL;PostgreSQL 的 concat 忽略空参数,concat_ws 还用分隔符连接非空参数。空字符串 '' 不等于 NULL。如果缺失部分应显示为空,需要明确使用 coalesce(value, '')。
长度、位置与截取
| 函数 | 示例 | 含义 |
|---|---|---|
char_length(s) | char_length('你好') = 2 | 字符数 |
octet_length(s) | UTF-8 下 '你好' 为 6 | 字节数 |
position(substring in string) | position('b' in 'abc') = 2 | 首次出现的位置,未找到为 0 |
substring(s from start for count) | substring('abcdef' from 2 for 3) = 'bcd' | 从第 1 个字符起计数 |
left(s, n)、right(s, n) | left('abc', 2) = 'ab' | 取两端字符 |
编码影响字节数;界面字符数还可能不同于用户看到的“字形”数量,例如组合字符。不要用 octet_length 判断输入框可见字符个数。
清洗与替换
SELECT trim(' Ada '), lower('SQL'), upper('sql');
SELECT replace('a-b-c', '-', '/'); -- a/b/c
SELECT split_part('a,b,c', ',', 2); -- b
SELECT lpad('7', 3, '0'); -- 007
trim 默认去除两侧空格,btrim、ltrim、rtrim 可指定去除的字符集合;这与删除固定前缀或后缀不是一回事。replace 做字面替换,复杂模式替换可使用 regexp_replace。lower、upper 的大小写规则受区域设置影响,不能仅凭它们实现所有语言的用户标识符规范化。
性能与安全
对筛选列写 lower(email) 可能无法使用原有普通 B-tree 索引,可考虑表达式索引并查看执行计划。拼接 SQL 语句时不要用普通 concat 处理外部输入;值使用绑定参数,标识符使用可信白名单或安全引用机制。