跳到主要内容

字符串函数和操作符

文本函数用于清洗、组合和展示字符数据。以下以 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 处理外部输入;值使用绑定参数,标识符使用可信白名单或安全引用机制。