SUBSTRING (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

SQL Server で、文字、バイナリ、テキスト、またはイメージ型の式の一部を返します。

Transact-SQL 構文表記規則

構文

SUBSTRING ( expression, start, length )  

引数

式 (expression)
characterbinarytextntext、または image です。

start
返された文字の開始位置を示す integer 式または bigint 式です。 (番号は 1 から開始し、これは式の最初の文字が 1 であることを意味します)。 start に 1 より小さい値を指定した場合は、expression に指定された文字の先頭から値が返されます。 この場合、返される文字数は、start + length-1 の合計値か、0 のどちらか大きい方になります。 start が値式の文字数を上回る場合は、長さがゼロの式が返されます。

length
expression で返す文字数を正の整数または bigint 式で指定します。 length が負の場合はエラーが生成され、ステートメントは終了します。 startlength の合計が expression の文字数を上回る場合は、start の先頭から値式全体が返されます。

戻り値の型

expression が、サポートされている文字データ型の 1 つである場合は、文字データが返されます。 expression が、サポートされている binary データ型の 1 つである場合は、binary データが返されます。 返される文字列のデータ型は、指定した式のデータ型と同じです。ただし、次の表の場合は例外です。

指定した式 の戻り値の型 :
char/varchar/text varchar
nchar/nvarchar/ntext nvarchar
binary/varbinary/image varbinary

解説

値は、 開始長さ の文字数で指定する必要があります ntextchar、または varchar データ型とのバイト textimagebinary、または varbinary データ型。

する必要があります varchar (max) または varbinary (max) ときに、 開始 または 長さ 2,147, 483,647 を超える値が含まれています。

補助文字 (サロゲート ペア)

補助文字 (SC) の照合順序を使用する場合、startlength では、expression の各サロゲート ペアが 1 文字としてカウントされます。 詳細については、「 Collation and Unicode Support」を参照してください。

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

次の例では、文字列の一部分のみを返す方法を示しています。 sys.databases テーブルから、このクエリは最初の列でシステム データベース名、2 番目の列でデータベースの最初の文字、最後の列で 3 番目と 4 番目の文字を返します。

SELECT name, SUBSTRING(name, 1, 1) AS Initial ,
SUBSTRING(name, 3, 2) AS ThirdAndFourthCharacters
FROM sys.databases  
WHERE database_id < 5;   

結果セットは次のとおりです。

name Initial ThirdAndFourthCharacters
master m st
tempdb t mp
model m de
msdb m db

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

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

結果セットは次のとおりです。

x  
----------  
bcd  
 
(1 row(s) affected)

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

Note

次の例を実行するには、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 データベースに新しいテーブルを作成します。 次に、pr_info 列の最初の 80 文字から npub_info テーブルの pub_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;  

例: Azure Synapse Analytics、Analytics Platform System (PDW)

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

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

-- Uses AdventureWorks  
  
SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial  
FROM dbo.DimEmployee  
WHERE LastName LIKE 'Bar%'  
ORDER BY LastName;  

結果セットは次のとおりです。

LastName             Initial
-------------------- -------
Barbariol            A
Barber               D
Barreto de Mattos    P

次の例では、文字列定数 abcdef の 2 番目、3 番目、4 番目の文字を返す方法を示します。

USE ssawPDW;  
  
SELECT TOP 1 SUBSTRING('abcdef', 2, 3) AS x FROM dbo.DimCustomer;  

結果セットは次のとおりです。

x
-----
bcd

参照

LEFT (Transact-SQL)
LTRIM (Transact-SQL)
RIGHT (Transact-SQL)
RTRIM (Transact-SQL)
STRING_SPLIT (Transact-SQL)
TRIM (Transact-SQL)
文字列関数 (Transact-SQL)