使用英语阅读

通过


SUBSTRING (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库

返回 SQL Server 中的字符、二进制、文本或图像表达式的一部分。

Transact-SQL 语法约定

语法

SQL Server 的语法。

SUBSTRING ( expression , start , length )

Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点的语法。

SUBSTRING ( expression , start [ , length ] )

参数

expression

字符二进制文本ntext图像表达式

start

一个整数或 bigint 表达式,指定返回的字符的起始位置。 (编号从 1 开始,意味着表达式中的第一个字符为 1)。 如果 start 小于 1,则返回的表达式从 表达式中指定的第一个字符开始。 在这种情况下,返回的字符数是 起始 + 长度 之和 - 1 或 0 的最大值。 如果 start 大于值表达式中的字符数,将返回一个零长度的表达式 。

length

一个正整数或 bigint 表达式,指定返回 表达式 的字符数。 如果 length 是负数,会生成错误并终止语句 。 如果 start 和 length 的总和大于表达式中的字符数,则会返回从 start 开始的整个值表达式 。 如果省略 长度 ,则返回从开始位置到表达式末尾的所有字符。

可以在 Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点中使用可选 长度 参数的子字符串。 但是,如果使用NULL长度SUBSTRINGNULL返回 。 查看 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 支持

示例

A. 将 SUBSTRING 与字符串配合使用

以下示例说明如何仅返回字符串的一部分。 从 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

B. 将 SUBSTRING 与文本、ntext 和图像数据配合使用

备注

若要运行以下示例,必须安装 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;

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

C. 将 SUBSTRING 与字符串配合使用

以下示例说明如何仅返回字符串的一部分。 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

D. 将 SUBSTRING 与 length 参数配合使用NULL

SELECT SUBSTRING('123abc', 4, NULL) AS [NULL length];

结果集如下。

NULL length
-----------
NULL

E. 将 SUBSTRING 与可选的长度参数一起使用

适用于: azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、Analytics Platform System (PDW)和 Microsoft Fabric 中的仓库和 SQL 分析终结点

以下示例演示如何仅从给定起始位置返回字符串的一部分。 由于未提供 length 参数,长度默认返回字符串中的剩余字符。

SELECT SUBSTRING('123abc', 4) AS y;

结果集如下。

y
-----
abc

F. 在 AdventureWorks2022 清单中使用 SUBSTRING 而不使用长度参数查找替换部件

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 为入门级自行车手更换道路后轮。 入门级自行车手的道路后轮。