0Pricing
SQL Interview Prep · 课时

解析与格式化字符串

学习跨方言使用 SUBSTRING、位置函数、拆分和大小写转换。

解析与格式化字符串 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

为什么面试会考字符串函数

真实数据很杂乱:需要拆分的全名、要提取的电子邮件域名、嵌在标识符中的代码、大小写不一致的文本。面试官会通过字符串处理来考查您是否能在不导出到脚本的情况下清理并重塑文本。

与日期一样,这些函数的标准化程度不高,因此目标是掌握概念和常见变体。

  • 子字符串提取与位置
  • 字符串拼接
  • 拆分与替换
  • 大小写转换与去除空白

SUBSTRING 与位置

SUBSTRING(s FROM start FOR length) 是 SQL 标准形式;大多数引擎也接受 SUBSTRING(s, start, length)。字符串位置从1 开始编号,对于习惯使用从 0 开始编号语言的程序员来说,这是一个经典的差一错误陷阱。

POSITION(sub IN s)(或 STRPOS/CHARINDEX)可以查找子字符串的起始位置,未找到时返回 0。

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

提取电子邮件域名

这是一个经典的完整示例。先查找 @,然后提取其后的所有内容。将 POSITION 与 SUBSTRING 结合起来是通用做法。

在 PostgreSQL 中,您也可以使用 SPLIT_PART(email, '@', 2),它更易读,也是值得提及的惯用答案。

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

跨 SQL 方言的字符串拼接

字符串拼接取决于具体方言,面试官希望您了解各种写法。

  • SQL 标准 / PostgreSQL / Oracle:使用 || 运算符。
  • MySQL:使用 CONCAT(a, b, c)(|| 运算符默认表示逻辑 OR)。
  • SQL Server:对字符串使用 +,或使用 CONCAT()。

CONCAT() 会将 NULL 视为空字符串,而 || 和 + 通常会在任一操作数为 NULL 时使整个结果变为 NULL,这是一个容易产生细微错误的地方。

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

NULL 拼接陷阱

接着上一个场景:如果 last_name 为 NULL,那么 first_name || ' ' || last_name 在 PostgreSQL 中会返回 NULL,从而抹掉整个姓名。

稳妥的修复方法是在可为空的部分使用 COALESCE,或者使用 CONCAT_WS(带分隔符的拼接),它会跳过 NULL,并且只在存在的值之间插入分隔符。

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

拆分字符串

“从连字符连接的代码中提取第三段”考查的是字符串拆分。PostgreSQL 的 SPLIT_PART(s, delim, n) 可以直接返回第 n 个片段,是最简洁的工具。

MySQL 没有直接的拆分函数;惯用写法是嵌套使用 SUBSTRING_INDEX:先取前 n 个片段,再取其中最后一个片段。

-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

替换、去除空白与填充

面试官希望您看到就能写出的清理操作:

  • REPLACE(s, from, to) 会替换所有匹配项。
  • TRIM(s) 会去除开头和结尾的空格;TRIM(BOTH 'x' FROM s) 会去除指定字符。
  • LPAD(s, len, ch) / RPAD 会填充到固定宽度,适合为标识符补零。
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

大小写转换与长度

在比较或分组文本之前,统一大小写非常重要。UPPER 和 LOWER 几乎通用;INITCAP(PostgreSQL/Oracle)会将单词转换为标题式大小写。

LENGTH(s) 在大多数引擎中返回字符数,但请注意:SQL Server 使用 LEN(),而且在某些配置下,LENGTH 对多字节文本统计的是字节数。处理非 ASCII 数据时,请提及这一细节。

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

超越 LIKE 的模式匹配

当 LIKE 不够强大时,面试官希望看到您了解正则表达式。PostgreSQL 提供 ~ 运算符以及 REGEXP_REPLACE / REGEXP_MATCHES;MySQL 提供 REGEXP / REGEXP_SUBSTR。

例如:只保留电话号码字符串中的数字。与一连串的 REPLACE 调用相比,正则表达式可以用一行完成。

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

更深入的示例:规范化并去重姓名

这是一个综合清理任务。假设姓名中带有多余空格且大小写混杂,导致错误重复。先规范化,再分组。

去除首尾空白、使用正则表达式合并内部空白,并在统计不同值之前转换为小写。这正是面试官会认可的多步骤推理。

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

将字符串转换为数字和日期

字符串列经常存放本应是数字或日期的值。CAST(s AS INTEGER) 或 PostgreSQL 的简写形式 s::int 可以进行转换,但遇到无效输入会失败。

对于日期,TO_DATE(s, 'YYYY-MM-DD')(PostgreSQL/Oracle)使用明确的格式掩码进行解析,这是最安全的做法,因为它消除了日/月顺序的歧义。

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

快速检查

思考字符串拼接中的 NULL 行为。

回顾:解析和格式化字符串

面试中需要牢记的要点:

  • 字符串位置从 1 开始编号;SUBSTRING + POSITION 可以按位置提取内容。
  • 使用 ||(PostgreSQL)、CONCAT(MySQL)或 +(SQL Server)进行拼接,并记住 NULL 传播;优先使用 CONCAT_WS。
  • 使用 SPLIT_PART(PostgreSQL)或嵌套的 SUBSTRING_INDEX(MySQL)进行拆分。
  • REPLACE、TRIM、LPAD、UPPER/LOWER 可以清理和规范化文本;正则表达式适合处理复杂情况。
  • 在分组之前统一大小写和空白,以避免错误重复。

常见问题解答

「解析与格式化字符串」课时是免费的吗?

是的 — 「解析与格式化字符串」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「解析与格式化字符串」这节课中我会学到什么?

学习跨方言使用 SUBSTRING、位置函数、拆分和大小写转换。 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「解析与格式化字符串」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 日期运算与时间间隔
  2. 截断日期与划分日期区间
  3. 解析与格式化字符串
  4. 时区与时间戳
← 返回 SQL Interview Prep