SUBSTRING (Transact-SQL)
文字、バイナリ、テキスト、またはイメージ型の式の一部を返します。SQL Server で、この関数と一緒に使用できる有効なデータ型の詳細については、「データ型 (Transact-SQL)」を参照してください。
構文
SUBSTRING ( value_expression ,start_expression , length_expression )
引数
value_expression
character、binary、text、ntext、または image式を指定します。start_expression
返された文字の開始位置を示す integer 式または 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 が、サポートされている文字データ型の 1 つである場合は、文字データが返されます。expression が、サポートされている binary データ型の 1 つである場合は、バイナリ データが返されます。返される文字列のデータ型は、指定した式のデータ型と同じです。ただし、次の表の場合は例外です。
指定した式 |
戻り値の型 |
---|---|
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 テーブルから、最初の列に姓を、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 データ列から、それぞれ最初の 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 の両方のパブリッシャ情報列から、すべてのパブリッシャ 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;