本文内容
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统 (PDW)
Microsoft Fabric 中的 SQL 分析端点
Microsoft Fabric 中的仓库
返回 SQL Server 中的字符、二进制、文本或图像表达式的一部分。
SQL Server 的语法。
SUBSTRING ( expression , start , length )
Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点的语法。
SUBSTRING ( expression , start [ , length ] )
字符、二进制、文本、ntext 或图像表达式。
一个整数或 bigint 表达式,指定返回的字符的起始位置。 (编号从 1 开始,意味着表达式中的第一个字符为 1)。 如果 start 小于 1,则返回的表达式从 表达式中指定的第一个字符开始。 在这种情况下,返回的字符数是 起始 + 长度 之和 - 1 或 0 的最大值。 如果 start 大于值表达式中的字符数,将返回一个零长度的表达式 。
一个正整数或 bigint 表达式,指定返回 表达式 的字符数。 如果 length 是负数,会生成错误并终止语句 。 如果 start 和 length 的总和大于表达式中的字符数,则会返回从 start 开始的整个值表达式 。 如果省略 长度 ,则返回从开始位置到表达式末尾的所有字符。
可以在 Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点中使用可选 长度 参数的子字符串。 但是,如果使用NULL
长度,SUBSTRING
则NULL
返回 。 查看 E.对示例使用具有可选长度参数的 SUBSTRING 。
如果 expression 是支持的字符数据类型之一,则返回字符数据 。 如果 expression 是 binary 支持的字符数据类型之一,则返回字符数据 。 返回的字符串类型与指定表达式的类型相同(表中显示的除外)。
指定的表达式 | 返回类型 |
---|---|
char / varchar / text | varchar |
nchar / nvarchar / ntext | nvarchar |
binary / varbinary / image | varbinary |
start 和 length 的值对于 ntext、char 或 varchar 数据类型必须以字符数指定,对于 text、image、binary 或 varbinary 数据类型,则以字节数指定 。
当开始或长度包含大于 2,147,483,647 的值时,表达式必须为 varchar(max) 或 varbinary(max)。
使用补充字符(SC)排序规则时,表达式中每个代理项对的开始和长度计数都作为单个字符。 有关详细信息,请参阅 排序规则和 Unicode 支持。
以下示例说明如何仅返回字符串的一部分。 从 sys.databases
表中,此查询返回第一列中的系统数据库名称、第二列中的数据库的第一个字母和最后一列中的第三和第四个字符。
SELECT name,
SUBSTRING(name, 1, 1) AS Initial,
SUBSTRING(name, 3, 2) AS ThirdAndFourthCharacters
FROM sys.databases
WHERE database_id < 5;
结果集如下。
name | 初始 | ThirdAndFourthCharacters |
---|---|---|
master |
m |
st |
tempdb |
t |
mp |
model |
m |
de |
msdb |
m |
db |
若要显示字符串常量 abcdef
的第二、第三和第四个字符,请使用以下查询。
SELECT SUBSTRING('abcdef', 2, 3) AS x;
结果集如下。
x
----------
bcd
备注
若要运行以下示例,必须安装 pubs 数据库。
以下示例说明如何返回 数据库的 表内每个 text 和 image 数据列的前 10 个字符 。 text 数据返回为 varchar,而 image 数据返回为 varbinary 。
USE pubs;
GO
SELECT pub_id,
SUBSTRING(logo, 1, 10) AS logo,
SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756';
结果集如下。
pub_id logo pr_info
------ ---------------------- ----------
1756 0x474946383961E3002500 This is sa
以下示例显示了文本和 ntext 数据的效果SUBSTRING
。 首先,该示例在 pubs
数据库内创建一个名为 npub_info
的新表。 接着,该示例使用 pr_info
列的前 80 个字符在 npub_info
表中创建 pub_info.pr_info
列,然后将添加 ü
为第一个字符。 最后,INNER JOIN
检索所有出版商标识号以及 text 和 ntext 出版商信息列的SUBSTRING
。
IF EXISTS (SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'npub_info')
DROP TABLE npub_info;
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs;
GO
CREATE TABLE npub_info
(
pub_id CHAR (4) NOT NULL FOREIGN KEY
REFERENCES publishers (pub_id)
CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
pr_info NTEXT NULL
);
GO
-- Fill the pr_info column in npub_info with international data.
RAISERROR ('Now at the inserts to pub_info...', 0, 1);
GO
INSERT npub_info
VALUES ('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database'),
('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa'),
('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da'),
('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database'),
('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d'),
('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab'),
('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i'),
('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data');
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id,
SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info AS pr
INNER JOIN npub_info AS npr
ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC;
以下示例说明如何仅返回字符串的一部分。
dbo.DimEmployee
从表中,此查询返回一列中的系列名称,该列仅返回第二列中的第一个首字母。
-- Uses AdventureWorks
SELECT LastName,
SUBSTRING(FirstName, 1, 1) AS Initial
FROM dbo.DimEmployee
WHERE LastName LIKE 'Bar%'
ORDER BY LastName;
结果集如下。
LastName Initial
-------------------- -------
Barbariol A
Barber D
Barreto de Mattos P
以下示例显示如何返回字符串常量 abcdef
的第二个、第三个和第四个字符。
USE ssawPDW;
SELECT TOP 1 SUBSTRING('abcdef', 2, 3) AS x
FROM dbo.DimCustomer;
结果集如下。
x
-----
bcd
SELECT SUBSTRING('123abc', 4, NULL) AS [NULL length];
结果集如下。
NULL length
-----------
NULL
适用于: azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点
以下示例演示如何仅从给定起始位置返回字符串的一部分。 由于未提供 length 参数,长度默认返回字符串中的剩余字符。
SELECT SUBSTRING('123abc', 4) AS y;
结果集如下。
y
-----
abc
USE AdventureWorks2022;
GO
SELECT [ProductDescriptionID],
[Description],
SUBSTRING([Description], LEN('Replacement') + 1) AS [Replacement-Part]
FROM [Production].[ProductDescription]
WHERE [Description] LIKE 'Replacement%';
结果集如下。
ProductDescriptionID | DESCRIPTION | Replacement-Part |
---|---|---|
686 | 更换山轮为入门级骑手。 | 入门级骑手的山轮。 |
687 | 更换山轮为休闲车手严肃。 | 山轮为休闲的严肃骑手。 |
689 | 适用于入门级自行车手的更换道路前轮。 | 入门级自行车手的道路前轮。 |
867 | 更换后山轮为入门级骑手。 | 入门级骑手的后山轮。 |
868 | 更换后山轮为休闲到严肃骑手。 | 后山轮为休闲认真骑手。 |
870 | 为入门级自行车手更换后轮。 | 入门级自行车手的后轮。 |
1981 | 更换山轮为入门级骑手。 | 入门级骑手的山轮。 |
1987 | 更换山轮为休闲车手严肃。 | 山轮为休闲的严肃骑手。 |
1999 | 为入门级自行车手更换道路后轮。 | 入门级自行车手的道路后轮。 |