Skip to content

SQL Wildcards

通配符(wildcard character)是 SQL 中用于替代字符串中任何其他字符的特殊字符。通配符主要与 WHERE 子句中的 LIKE 运算符一起使用,用于在字符串数据中搜索特定的模式。

SQL 定义了两个与 LIKE 运算符一起用于模式匹配的标准通配符:

  • %(百分号):代表零个、一个或多个字符。
  • _(下划线):代表单个字符。

这些通配符使得 LIKE 运算符比使用简单的相等(=)或不等(!=)运算符进行字符串比较更加灵活。

SELECT column_list FROM table_name WHERE column_name LIKE ‘pattern’;

在我们的示例中,我们将使用概念性的“Customers”(客户)表。

“Customers”表的示例数据:

CustomerIDCustomerNameCityCountry
1Alfreds FutterkisteBerlinGermany
2Ana Trujillo Emparedados y heladosMéxico D.F.Mexico
3Antonio Moreno TaqueríaMéxico D.F.Mexico
4Around the HornLondonUK
5Berglunds snabbköpLuleåSweden
6Blauer See DelikatessenMannheimGermany

% 通配符匹配任何字符序列(包括空序列)。

示例 1:查找 City 以“ber”开头的客户:

SELECT CustomerName, City
FROM Customers
WHERE City LIKE 'ber%';

这将匹配 ‘Berlin’、‘Berkeley’ 等。

示例 2:查找 CustomerName 包含模式“er”的客户:

SELECT CustomerName, City
FROM Customers
WHERE CustomerName LIKE '%er%';

这将匹配 ‘Alfreds Futterkiste’、‘Berglunds snabbköp’、‘Blauer See Delikatessen’ 等。

示例 3:查找 Country 以“y”结尾的客户:

SELECT CustomerName, Country
FROM Customers
WHERE Country LIKE '%y';

这将匹配 ‘Germany’。

_ 通配符匹配任何单个字符。

示例 1:查找 City 以任何一个字符开头,后跟“ondon”的客户:

SELECT CustomerName, City
FROM Customers
WHERE City LIKE '_ondon';

这将匹配 ‘London’。

示例 2:查找 City 以“L”开头,后跟任意两个字符,然后是“d”,然后是任意一个字符,然后是“n”的客户:

SELECT CustomerName, City
FROM Customers
WHERE City LIKE 'L__d_n%';

这可能匹配 ‘London’,如果完整的模式是 ‘L_n_on’(来自原文)。对于 ‘L__d_n%‘,它将匹配像 ‘Luddenham’ 这样的城市(如果存在且匹配)。对于 ‘London’,模式 L_n_on 更具体。

让我们使用一个更清晰的例子:查找长度为 6 个字符且以“in”结尾的城市:

SELECT DISTINCT City
FROM Customers
WHERE City LIKE '____in';

这将匹配 ‘Berlin’。

您可以使用 NOT LIKE 来查找不匹配特定模式的字符串。

示例:查找 City 不以“B”开头的客户:

SELECT CustomerName, City
FROM Customers
WHERE City NOT LIKE 'B%';

如果您需要在数据中搜索字面值百分号(%)或下划线(_),则需要使用转义字符。ESCAPE 关键词指定转义字符。

示例:查找名称中包含“50%”的产品(假设 “ 是转义字符):

SELECT ProductName
FROM Products
WHERE ProductName LIKE '%50\%%' ESCAPE '\';

常见的转义字符是反斜杠(“),有时也可以是其他字符,如 ! 或 #。

尽管 % 和 _ 是标准且广泛支持的,但某些数据库系统(如 MySQL、PostgreSQL、Oracle 以及具有特定设置的 SQL Server)通过正则表达式(regular expressions)提供了更强大的模式匹配功能。REGEXP、RLIKE、SIMILAR TO 等运算符,或 REGEXP_LIKE() 等函数,允许定义更复杂的模式。

例如,查找以 ‘B’、‘S’ 或 ‘P’ 开头的城市(这在之前使用非标准的 [bsp]% 来完成)可以通过正则表达式来实现,如果您的 RDBMS 支持的话(例如,在 MySQL 中使用 WHERE City REGEXP '^[bsp]' 或在 PostgreSQL 中使用 WHERE City ~ '^[bsp]')。

字符列表通配符,如 [charlist] 或 [^charlist],不是 ANSI SQL 标准的一部分,其支持因数据库系统而异。为了获得更好的通用性,请坚持使用 % 和 _,或者在支持且必要时使用正则表达式。