SUBSTRING(Transact-SQL)
문자, 이진, 텍스트 또는 이미지 식의 일부를 반환합니다. 이 함수에 사용할 수 있는 유효한 SQL Server 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오.
구문
SUBSTRING ( value_expression ,start_expression , length_expression )
인수
value_expression
character, binary, text, ntext 또는 image식입니다.start_expression
반환된 문자가 시작되는 위치를 지정하는 정수 또는 bigint 식입니다. start_expression이 1보다 작은 경우 반환되는 식은 value_expression에 지정된 첫째 문자에서 시작합니다. 이 경우 반환되는 문자 수는 start_expression과 length_expression의 합계 또는 0 중에서 더 큰 값입니다. start_expression이 값 식의 문자 수보다 크면 길이가 0인 식이 반환됩니다.length_expression
반환될 value_expression의 문자 수를 지정하는 양의 정수 또는 bigint 식입니다. length_expression이 음수이면 오류가 발생하면서 문이 종료됩니다. start_expression과 length_expression의 합계가 value_expression의 문자 수보다 크면 start_expression에서 시작하는 전체 값 식이 반환됩니다.
반환 형식
expression이 지원되는 문자 데이터 형식 중 하나이면 문자 데이터를 반환합니다. expression이 지원되는 binary 데이터 형식 중 하나이면 이진 데이터를 반환합니다. 반환되는 문자열은 다음 표에 표시된 항목을 제외하고 지정된 식과 같은 형식입니다.
지정된 식 |
반환 형식 |
---|---|
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)을 참조하십시오.
예
1. 문자열과 SUBSTRING 사용
다음 예에서는 문자열의 일부를 반환하는 방법을 보여 줍니다. 이 쿼리는 Contact 테이블을 사용하여 첫째 열에 성을 반환하고 둘째 열에 이름의 머리글자를 반환합니다.
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개 행 적용됨)
다음 예에서는 문자열 상수 abcdef의 둘째, 셋째, 넷째 문자를 표시하는 방법을 보여 줍니다.
SELECT x = SUBSTRING('abcdef', 2, 3);
결과 집합은 다음과 같습니다.
x
----------
bcd
(1개 행 적용됨)
2. text, ntext, image 데이터와 SUBSTRING 사용
[!참고]
다음 예를 실행하려면 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개 행 적용됨)
다음 예에서는 text 및 ntext 데이터에 대한 SUBSTRING의 결과를 보여 줍니다. 이 예제는 먼저 pubs 데이터베이스에서 npub_info라는 새 테이블을 만듭니다. 다음 pub_info.pr_info 열의 처음 80자로 npub_info 테이블의 pr_info 열을 만들고 ü를 첫 번째 문자로 추가합니다. 마지막으로 INNER JOIN을 사용해 모든 게시자 ID와 text 및 ntext 게시자 정보 열의 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;