共用方式為


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

備註

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

當 start 或 length 包含大於 2147483647 的值時,expression 必須是 varchar(max) 或 varbinary(max) 。

補充字元 (Surrogate 字組)

當使用 SC 定序時,start 和 length 會將 expression 中的每個 Surrogate 字組計算為單一字元。 如需詳細資訊,請參閱<定序與 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.使用 SUBSTRING 與 text、ntext 以及 image 資料

[!附註]

若要執行下列範例,您必須安裝 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)

下列範例會顯示 text 和 ntext 資料的 SUBSTRING 效果。 首先,這個範例會在名稱為 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')
,('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)