閱讀英文

共用方式為


SUBSTRING (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 的 SQL 端點分析Microsoft Fabric 的倉儲

在 SQL Server 中傳回字元、二進位、文字或影像運算式的一部分。

Transact-SQL 語法慣例

語法

SQL Server 的語法。

SUBSTRING ( expression , start , length )

Azure SQL Database、Azure SQL 受控實例、Azure Synapse Analytics、Analytics Platform System (PDW) 和 Microsoft Fabric 中的倉儲和 SQL 分析端點的語法。

SUBSTRING ( expression , start [ , length ] )

引數

expression

字元二進位textntextimage運算式

start

指定傳回字元開始位置的整數或 bigint 運算式。 (編號是以 1 為基礎,這表示運算式中的第一個字元為 1)。 如果 start 小於 1,則傳回的表示式會從 表達式中指定的第一個字元開始。 在此情況下,傳回的字元數是 開始 + 長度 總和 - 1 或 0 的最大值。 如果 start 大於值運算式中的字元數,則會傳回長度為零的運算式。

length

正整數或 bigint 運算式,指定傳回 表示式 的字元數。 如果 length 是負數,則會產生錯誤並結束此陳述式。 如果 startlength 的總和大於 expression 中的字元數,則會傳回從 start 開始的整個值運算式。 如果省略 length ,則會傳回從開始位置到表達式結尾的所有字元。

您可以在 Azure SQL Database、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

備註

startlength 的值必須指定為字元數 (適用於 ntextcharvarchar 資料類型) 和位元組數 (適用於 textimagebinaryvarbinary 資料類型)。

開始長度包含大於 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 Initial ThirdAndFourthCharacters
master m st
tempdb t mp
model m de
msdb m db

若要顯示字串常數 abcdef的第二、第三和第四個字元,請使用下列查詢。

SELECT SUBSTRING('abcdef', 2, 3) AS x;

結果集如下所示。

x
----------
bcd

B. 搭配 text、ntext 和 image 數據使用 SUBSTRING

注意

若要執行下列範例,您必須安裝 pubs 資料庫

下列範例示範如何從 資料庫之 資料表的各個 pub_infopubs資料行傳回前 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

下列範例顯示對 textntext 數據的影響SUBSTRING。 首先,這個範例會在名稱為 pubsnpub_info 資料庫中,建立一份新的資料表。 其次,這個範例會從 pr_info 資料行的前 80 個字元中,建立 npub_info 資料表的 pub_info.pr_info 資料行,再加入 ü 來作為第一個字元。 最後,INNER JOIN 會擷取所有簽發者識別碼,以及 SUBSTRINGntext 發行者資訊資料行的

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 NULL

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

結果集如下所示。

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

E. 搭配選擇性長度自變數使用 SUBSTRING

適用於: Azure SQL Database、Azure SQL 受控實例、Azure Synapse Analytics、Analytics Platform System (PDW),以及 Microsoft Fabric 中的倉儲和 SQL 分析端點

下列範例示範如何只從指定的開始位置傳回字元字串的一部分。 由於未提供 length 自變數,因此長度預設會傳回字串中的其餘字元。

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

結果集如下所示。

y
-----
abc

F. 在 AdventureWorks2022 清查中使用 SUBSTRING 而不使用 length 自變數來尋找替代元件

USE AdventureWorks2022;
GO

SELECT [ProductDescriptionID],
       [Description],
       SUBSTRING([Description], LEN('Replacement') + 1) AS [Replacement-Part]
FROM [Production].[ProductDescription]
WHERE [Description] LIKE 'Replacement%';

結果集如下所示。

ProductDescriptionID 說明 Replacement-Part
686 更換入門級騎手的山輪。 入門級騎手的山輪。
687 更換山輪為休閒的嚴肅騎手。 山輪讓休閒車手嚴肅。
689 更換入門級自行車手的道路前輪。 入門級自行車手的道路前輪。
867 更換入門級騎手的後山輪。 入門級騎手的後山輪。
868 更換後山輪為休閒車手。 後山輪讓休閒到嚴肅的騎手。
870 更換入門級自行車手的後輪。 入門級自行車手的後輪。
1981 更換入門級騎手的山輪。 入門級騎手的山輪。
1987 更換山輪為休閒的嚴肅騎手。 山輪讓休閒車手嚴肅。
1999 為入門級自行車手更換道路後輪。 入門級自行車手的道路後輪。