跳至主要内容

SQL 字符串函数:新手指南

了解如何使用 SQL 字符串函数高效清洗和处理文本数据。
· 7分钟 阅读

使用 AI 探索

使用关系型数据库时,您常常需要处理杂乱的数据。其中最常见的挑战之一就是清洗和处理文本数据。幸运的是,SQL 提供了强大的字符串函数,能大幅提升这一过程的效率,为您节省时间与精力。

本文将带您了解最重要的 SQL 字符串函数,帮助您轻松清洗与处理文本数据。让我们开始吧!

什么是 SQL 字符串函数?

SQL 字符串函数是内置函数,用于处理并操作存储在数据库中的文本数据。常见的文本字段包括姓名、描述和地址等。

这些函数可用于完成多种任务,包括:

  • 连接字符串
  • 格式化文本
  • 提取字符串的部分内容
  • 在字符串中查找并替换特定文本

在 SQL 中连接字符串

我们可以使用函数 concat() 连接两个或多个字符串:

SELECT CONCAT('Street Roma',', ','72',', ','Padova') AS full_address

输出如下:

full_address           |
-----------------------+
Street Roma, 72, Padova|

该函数常用于合并来自不同列的信息,例如姓名和地址。

作为替代,您也可以使用 CONCAT_WS() 函数:

SELECT CONCAT_WS(',','Street Roma','72','Padova') as full_address

从语法上看,在需要用同一个分隔符连接两列以上的内容时,它更加简洁高效。

格式化文本

以下是一些用于调整文本的 SQL 字符串函数,可用于改变大小写、去除多余空格等。每个函数均附有其语法及对应说明。

函数语法

说明

LOWER(string)

将文本中的所有字符转换为小写

UPPER(string)

将文本中的所有字符转换为大写

 TRIM(string, [character])

默认移除字符串左右两侧的空格;若指定特殊字符,则移除该字符

LTRIM(string, [character])

默认移除字符串左侧的空格;若指定特殊字符,则移除该字符

RTRIM(string, [character])

默认移除字符串右侧的空格;若指定特殊字符,则移除该字符

接下来通过示例来理解这些函数的用法。设想一种情况:您的邮箱字段中含有大写字符,而国家/地区缩写为小写,您希望修正这些列的格式。

SELECT
		LOWER('[email protected]') AS email,
		UPPER('it') AS country

输出如下:

email              |country|
-------------------+-------+
anonymous@gmail.com|IT     |

除了更改大小写,去除字符串前后的空格也很常见。用于此类操作的主要函数是 TRIM() (同时移除两侧空格)。另有 LTRIM() 和 RTRIM() 可分别移除左侧与右侧空格:

SELECT  TRIM(' Street Roma, 72 ') AS trimmed_address,
	  LTRIM(' Street Roma, 72 ') AS ltrimmed_address,
	  RTRIM(' Street Roma, 72 ') AS rtrimmed_address

查询返回如下结果:

trimmed_address|ltrimmed_address|rtrimmed_address|
---------------+----------------+----------------+
Street Roma, 72|Street Roma, 72 | Street Roma, 72|

从结果可以看出各函数之间的差异。此外,TRIM() 不仅能移除空格,还可移除其他特殊字符。例如,我们想清理电话字段,去掉加号:

SELECT TRIM('++345','+') AS telephone

输出如下:

telephone|
---------+
345      |

可以看到,电话号码已被完全清理干净。

提取文本

在连接和格式化字符串之后,接下来看看如何使用特殊的 SQL 函数 SUBSTRING() 来提取文本。通过不同例子来掌握这个函数:

SELECT
		SUBSTRING('Antony',1,1) AS first_character, 
		SUBSTRING('Antony',1,3) AS first_3characters,
		SUBSTRING('Antony',1,5) AS first_5characters

输出如下:

first_character|first_3characters|first_5characters|
---------------+-----------------+-----------------+
A              |Ant              |Anton            |

我们还可以将此函数与前面函数结合使用:把首字母大写,其余字母转为小写,然后再将它们连接起来:

SELECT
LENGTH('antony') AS lenght_name,
SUBSTRING(UPPER('antony'),1,1) AS first_character,
SUBSTRING(LOWER('antony'),2,LENGTH('antony')) AS  last_characters,
CONCAT(SUBSTRING(UPPER('antony'),1,1),SUBSTRING(LOWER('antony'),
      2,LENGTH('antony'))) AS name

该查询返回如下结果:

lenght_name|first_character|LAST_characters|name  |
-----------+---------------+---------------+------+
          6|A              |ntony          |Antony|

除了前述函数之外,您还会注意到 LENGTH() 函数可用于获取字符串长度。在此场景中,它有助于确定最后一个字符的索引。

在 SQL 中查找与替换字符串

我们来看看用于查找与替换字符串的几个主要函数:

函数语法

说明

REPLACE(string,x,y)

将字符串中的 x 值替换为 y 值

CHARINDEX(x,string)

查找 x 值在字符串中的位置

非常实用的一个函数是 REPLACE(),用于将字符串中的某个子串替换为另一个子串:

SELECT
		'Street Roma - 32' AS address,
		replace('Street Roma - 32','-',',') AS cleaned_address

输出如下:

address         |cleaned_address |
----------------+----------------+
Street Roma - 32|Street Roma , 32|

在此示例中,我们将地址中的短横线替换为逗号。我们还可以尝试找出该短横线在地址中的位置:

SELECT
		'Street Roma - 32' AS address,
		LENGTH('Street Roma - 32') AS length_address,
		CHARINDEX('-','Street Roma - 32') AS location_dash

查询返回如下结果:

address         |length_address|location_dash|
----------------+--------------+-------------+
Street Roma - 32|            16|           13|

可以看到,符号 - 位于地址的第 13 个位置,几乎在字符串末尾。

结语

熟练掌握这些 SQL 字符串函数,能够显著提升数据清洗效率。当然,本文并未涵盖所有函数,而是精选了最重要的一部分。并非所有 SQL 函数在各数据库中都适用,具体情况取决于您所使用的数据库类型。例如,在 MySQL 中可以用 LOCATE() 替代 CHARINDEX。

若想练习这些函数,您可以查看我们的 Reporting in SQL 课程。它能帮助您成为数据清洗与复杂报表构建的高手。我们也推荐 SQL Fundamentals 技能路径,覆盖 SQL 的各项核心要点。

Eugenia Anello

作者

Eugenia Anello

数据科学家 - CRIF

主题