SUBSTRING (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
返回 SQL Server 中的字符、二进制、文本或图像表达式的一部分。
语法
SUBSTRING ( expression, start, length )
参数
expression
为 character、binary、text、ntext 或者 image 表达式。
start
指定返回字符的起始位置的整数或 bigint 表达式 。 (编号从 1 开始,意味着表达式中的第一个字符为 1)。 如果 start 小于 1,则返回的表达式的起始位置为表达式中指定的第一个字符 。 在这种情况下,返回的字符数是后两者中的较大值:start + length 之和减去 1,0。 如果 start 大于值表达式中的字符数,将返回一个零长度的表达式 。
length
是正整数或用于指定要返回的 expression 的字符数的 bigint 表达式 。 如果 length 是负数,会生成错误并终止语句 。 如果 start 和 length 的总和大于表达式中的字符数,则会返回从 start 开始的整个值表达式 。
返回类型
如果 expression 是支持的字符数据类型之一,则返回字符数据 。 如果 expression 是 binary 支持的字符数据类型之一,则返回字符数据 。 返回的字符串类型与指定表达式的类型相同(表中显示的除外)。
指定的表达式 | 返回类型 |
---|---|
char/varchar/text | varchar |
nchar/nvarchar/ntext | nvarchar |
binary/varbinary/image | varbinary |
备注
start 和 length 的值对于 ntext、char 或 varchar 数据类型必须以字符数指定,对于 text、image、binary 或 varbinary 数据类型,则以字节数指定 。
start 或 length 包含大于 2147483647 的值时,expression 必须是 varchar(max) 或 varbinary(max) 。
补充字符(代理项对)
在使用增补字符 (SC) 排序规则时,start 和 length 将 expression 中的每个代理项对计为一个字符 。 有关详细信息,请参阅 排序规则和 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 |
---|---|---|
主 | m | st |
tempdb | t | mp |
模型 | m | de |
msdb | m | db |
以下示例说明如何显示字符串常量 abcdef
中的第二个、第三个和第四个字符。
SELECT x = SUBSTRING('abcdef', 2, 3);
结果集如下。
x
----------
bcd
(1 row(s) affected)
B. 对 text、ntext 和 image 数据使用 SUBSTRING
注意
若要运行以下示例,必须安装 pubs 数据库 。
以下示例说明如何返回 pubs
数据库的 pub_info
表内每个 text 和 image 数据列的前 10 个字符 。 text 数据返回为 varchar,而 image 数据返回为 varbinary 。
USE pubs;
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
(1 row(s) affected)
以下示例说明 SUBSTRING 对 text 和 ntext 数据的影响 。 首先,该示例在 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
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 pr INNER JOIN npub_info 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
另请参阅
LEFT (Transact-SQL)
LTRIM (Transact-SQL)
RIGHT (Transact-SQL)
RTRIM (Transact-SQL)
STRING_SPLIT (Transact-SQL)
TRIM (Transact-SQL)
字符串函数 (Transact-SQL)