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 – 1 と 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) である必要があります。
注 |
---|
戻り値は、互換性レベルによって変わることがあります。互換性レベルの詳細については、「ALTER DATABASE 互換性レベル (Transact-SQL)」を参照してください。 |
使用例
A. SUBSTRING に文字列を使用する
次の例では、文字列の一部分のみを返す方法を示しています。このクエリでは、Person テーブルから、最初の列に姓を、2 番目の列には名のイニシャルのみを返します。
USE AdventureWorks2008R2;
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 の 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')
,('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;