SUBSTRING (Transact-SQL)

傳回字元、二進位、文字或影像運算式的一部份。如需有關可以搭配這個函數使用之有效 SQL Server 資料類型的詳細資訊,請參閱<資料類型 (Transact-SQL)>。

主題連結圖示Transact-SQL 語法慣例

語法

SUBSTRING ( value_expression ,start_expression , length_expression )

引數

  • value_expression
    是 character、binary、text、ntext 或 image運算式

  • start_expression
    是指定傳回之字元開始的整數或 bigint 運算式。如果 start_expression 小於 1,傳回的運算式將會從 value_expression 內指定的第一個字元開始。在此情況下,傳回的字元數會是 start_expression 和 length_expression 的總和或是 0 (以最大值為準)。如果 start_expression 大於值運算式中的字元數,則會傳回長度為零的運算式。

  • length_expression
    這是一個正整數,或是指定將傳回之 value_expression 字元數的 bigint 運算式。如果 length_expression 是負數,則會產生錯誤並結束此陳述式。如果 start_expression 和 length_expression 的總和大於 value_expression 中的字元數,則會傳回從 start_expression 開始的整個值運算式。

傳回類型

如果 expression 是支援的字元資料類型之一,就會傳回字元資料。如果 expression 是支援的 binary 資料類型之一,就會傳回二進位資料。傳回的字串與指定運算式的類型相同,但下表所顯示者例外。

指定的運算式

傳回類型

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

備註

start_expression 和 length_expression 的值必須指定為字元數 (適用於 ntext、char 或 varchar 資料類型) 和位元組數 (適用於text、image、binary 或 varbinary 資料類型)。

當 start_expression 或 length_expression 包含大於 2147483647 的值時,value_expression 必須是 varchar(max) 或 varbinary(max)。

[!附註]

相容性層級可能會影響傳回值。如需有關相容性層級的詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

範例

A. 搭配字元字串使用 SUBSTRING

下列範例會顯示如何只傳回字元字串的一部份。這個查詢會從 Contact 資料表中,傳回第一個資料行中的姓氏,而第二個資料行中只有第一個首字母。

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

以下為結果集:

LastName Initial

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

Barley R

Barlow B

(2 個資料列受到影響)

以下示範如何顯示字串常數 abcdef 的第二、第三和第四個字元。

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

以下為結果集:

x

----------

bcd

(1 個資料列受到影響)

B. 搭配 text、ntext 和 image 資料使用 SUBSTRING

[!附註]

若要執行下列範例,您必須安裝 pubs 資料庫。如需有關如何安裝 pubs 資料庫的資訊,請參閱<下載 Northwind 和 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 個資料列受到影響)

下列範例會顯示 SUBSTRING 對於 text 和 ntext 資料的影響。首先,這個範例會在名稱為 npub_info 的 pubs 資料庫中,建立一份新的資料表。其次,這個範例會從 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');
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa');
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da');
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database');
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d');
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab');
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i');
INSERT npub_info values('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;

請參閱

參考