SUBSTRING (Transact-SQL)

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

トピック リンク アイコン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;

関連項目

参照