SUBSTRING(Transact-SQL)
문자, 이진, 텍스트 또는 이미지 식의 일부를 반환합니다. 이 함수에 사용할 수 있는 유효한 SQL Server 2005 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오.
구문
SUBSTRING ( expression ,start , length )
인수
expression
문자열, 이진 문자열, 텍스트, 이미지, 열 또는 열을 포함하는 식입니다. 집계 함수를 포함하는 식은 사용하지 마십시오.
start
부분 문자열이 시작하는 위치를 지정하는 정수입니다. start는 bigint 형식일 수 있습니다.
length
반환될 식의 문자 또는 바이트 수를 지정하는 양의 정수입니다. length가음수이면 오류가 반환됩니다. length는****bigint 형식일 수 있습니다.
[!참고] start 및 length는 바이트 수를 지정하므로 한글과 같이 DBCS 데이터 정렬을 사용하는 text 데이터 형식에 SUBSTRING을 사용하는 경우 결과의 시작 또는 끝에서 문자가 잘릴 수 있습니다. 이 동작은 READTEXT가 DBCS를 처리하는 방법과 동일합니다. 따라서 DBCS 문자에는 text 대신 ntext를 사용하는 것이 좋습니다. 다른 대안으로 DBCS 데이터 정렬을 위해 문자를 분리하지 않는 varchar(max) 데이터 형식을 사용할 수 있습니다.
주의
ntext, char 또는 varchar 데이터 형식을 사용하는 오프셋(start 및 length)은 문자 수로 지정해야 합니다. text, image, binary 또는 varbinary 데이터 형식을 사용하는 오프셋은 바이트 수로 지정해야 합니다.
[!참고] 반환되는 값은 호환성 수준에 따라 달라질 수 있습니다. 호환성 수준에 대한 자세한 내용은 sp_dbcmptlevel(Transact-SQL)을 참조하십시오.
반환 형식
expression이 지원되는 문자 데이터 형식 중 하나이면 문자 데이터를 반환합니다. expression이 지원되는 이진 데이터 형식 중 하나이면 이진 데이터를 반환합니다.
반환되는 문자열은 다음 표에 표시된 항목을 제외하고 지정된 식과 같은 형식입니다.
지정된 식 | 반환 형식 |
---|---|
char/varchar/text |
varchar |
nchar/nvarchar/ntext |
nvarchar |
binary/varbinary/image |
varbinary |
예
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 row(s) affected)
다음 예에서는 문자열 상수 abcdef
의 둘째, 세째, 네째 문자를 표시하는 방법을 보여줍니다.
SELECT x = SUBSTRING('abcdef', 2, 3)
결과 집합은 다음과 같습니다.
x
----------
bcd
(1 row(s) affected)
2. text, ntext, image 데이터와 SUBSTRING 사용
[!참고] 다음 예를 실행하려면 pubs 데이터베이스를 설치해야 합니다. pubs 데이터베이스의 설치 방법은 Northwind 및 pubs 예제 데이터베이스 다운로드를 참조하십시오.
다음 예에서는 pubs
데이터베이스의 pub_info
테이블에 있는 text 및 image 데이터 열의 각 항목에서 처음 200자를 반환하는 방법을 보여 줍니다. 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의 효과를 보여 줍니다. 이 예제는 먼저 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