SUBSTRING (Transact-SQL)
文字、バイナリ、テキスト、またはイメージ型の式の一部を返します。SQL Server 2005 で、この関数と一緒に使用できる有効なデータ型の詳細については、「データ型 (Transact-SQL)」を参照してください。
構文
SUBSTRING ( expression ,start , length )
引数
expression
文字列、バイナリ文字列、テキスト、イメージ、列、または列を含む式を指定します。集計関数を含む式は使用できません。
start
部分文字列の開始位置を整数で指定します。start のデータ型は bigint です。
length
expression で返す文字数またはバイト数を正の整数で指定します。lengthが負の場合、エラーが返されます。lengthのデータ型は bigint です。
メモ : |
---|
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) でntext、char、または varchar データ型を使用する場合は、文字数で指定する必要があります。オフセットで text、image、binary、または varbinary データ型を使用する場合は、バイト数で指定する必要があります。
メモ : |
---|
戻り値は、互換性レベルによって変わることがあります。互換性レベルの詳細については、「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 型のデータを使用する
メモ : |
---|
次の例を実行するには、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