SUBSTRING (Transact-SQL)

文字、バイナリ、テキスト、またはイメージ型の式の一部を返します。SQL Server 2005 で、この関数と一緒に使用できる有効なデータ型の詳細については、「データ型 (Transact-SQL)」を参照してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SUBSTRING ( expression ,start , length )

引数

expression

文字列、バイナリ文字列、テキスト、イメージ、列、または列を含むを指定します。集計関数を含む式は使用できません。

start

部分文字列の開始位置を整数で指定します。start のデータ型は bigint です。

length

expression で返す文字数またはバイト数を正の整数で指定します。lengthが負の場合、エラーが返されます。lengthのデータ型は bigint です。

ms187748.note(ja-jp,SQL.90).gifメモ :
start および length ではバイト数を指定するため、漢字などの DBCS 照合順序がある text データ型で SUBSTRING を使用すると、結果の先頭や末尾の文字が分割されることがあります。この動作は、READTEXT で DBCS が扱われる場合と同じです。したがって、DBCS 文字に対しては text の代わりに ntext を使用することをお勧めします。または、varchar(max) データ型を使用することをお勧めします。このデータ型では DBCS 照合順序の文字が分割されません。

戻り値の型

expression が、サポートされている文字データ型の 1 つである場合は、文字データが返されます。expression が、サポートされている binary データ型の 1 つである場合は、バイナリ データが返されます。

返される文字列のデータ型は、指定した式のデータ型と同じです。ただし、次の表の場合は例外です。

指定した式 戻り値の型

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

解説

オフセット (start および length) でntextchar、または varchar データ型を使用する場合は、文字数で指定する必要があります。オフセットで textimagebinary、または varbinary データ型を使用する場合は、バイト数で指定する必要があります。

ms187748.note(ja-jp,SQL.90).gifメモ :
戻り値は、互換性レベルによって変わることがあります。互換性レベルの詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

A. SUBSTRING に文字列を使用する

次の例では、文字列の一部分のみを返す方法を示しています。このクエリでは、Contact テーブルから、最初の列に姓を、2 番目の列には名のイニシャルのみを返します。

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 row(s) affected)

文字列定数 abcdef の 2 番目、3 番目、および 4 番目の文字を表示するには、次のようにします。

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

以下に結果セットを示します。 

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

(1 row(s) affected)

B. SUBSTRING に text、ntext、および image 型のデータを使用する

ms187748.note(ja-jp,SQL.90).gifメモ :
次の例を実行するには、pubs データベースをインストールする必要があります。pubs データベースのインストール方法については、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。

次の例では、pubs データベースにある pub_info テーブルの text および image データ列から、それぞれ最初の 200 文字を返します。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 の両方のパブリッシャ情報列から、すべてのパブリッシャ ID 番号と 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

参照

関連項目

文字列関数 (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手