SUBSTRING (Transact-SQL)

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

主题链接图标 Transact-SQL 语法约定

语法

SUBSTRING ( expression ,start , length )

参数

  • expression
    是 character、binary、text、ntext 或 image 表达式

  • start
    指定返回字符的起始位置的整数或 bigint 表达式。 如果 start 小于 1,则返回的表达式的起始位置为 expression 中指定的第一个字符。 在这种情况下,返回的字符数是 start 与 length 的和减去 1 所得的值与 0 这两者中的较大值。 如果 start 大于值表达式中的字符数,将返回一个零长度的表达式。

  • length
    是正整数或指定要返回的 expression 的字符数的 bigint 表达式。 如果 length 是负数,会生成错误并终止语句。 如果 start 与 length 的和大于 expression 中的字符数,则返回起始位置为 start 的整个值表达式。

返回类型

如果 expression 是其中一个受支持的字符数据类型,则返回字符数据。 如果 expression 是支持的 binary 数据类型中的一种数据类型,则返回二进制数据。 返回的字符串类型与指定表达式的类型相同(表中显示的除外)。

指定的表达式

返回类型

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

注释

对于 ntext、char 或 varchar 数据类型,必须以字符数指定 start 和 length 的值;对于 text、image、binary 或 varbinary 数据类型,则必须以字节数指定。

当 start 或 length 包含大于 2147483647 的值时,expression 的数据类型必须为 varchar(max) 或 varbinary(max) 。

补充字符(代理项对)

在使用 SC 排序规则时,start 和 length 将 expression 中的每个代理项对计为一个字符。 有关详细信息,请参阅排序规则和 Unicode 支持

示例

A.对字符串使用 SUBSTRING

以下示例说明如何仅返回字符串的一部分。 该查询在一列中返回 Person 表中的姓氏,在另一列中只返回名字首字母。

USE AdventureWorks2012;
GO
SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial
FROM Person.Person
WHERE LastName like 'Barl%'
ORDER BY LastName;

下面是结果集:

LastName      Initial

--------      -------

Barley        R

Barlow        B

(2 row(s) affected)

以下示例说明如何显示字符串常量 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 的新表。 接着,该示例使用 pub_info.pr_info 列的前 80 个字符在 npub_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;

请参阅

参考

字符串函数 (Transact-SQL)