SUBSTRING(Transact-SQL)
SQL Server 2012에서 문자, 이진, 텍스트 또는 이미지 식의 일부를 반환합니다.
구문
SUBSTRING ( expression ,start , length )
인수
expression
character, binary, text, ntext 또는 image 식입니다.start
반환된 문자가 시작되는 위치를 지정하는 정수 또는 bigint 식입니다. start가 1보다 작은 경우 반환되는 식은 expression에 지정된 첫째 문자에서 시작합니다. 이 경우 반환되는 문자 수는 start+length–1의 합 또는 0 중에서 더 큰 값입니다. start가 값 식의 문자 수보다 크면 길이가 0인 식이 반환됩니다.length
반환될 expression의 문자 수를 지정하는 양의 정수 또는 bigint 식입니다. length가 음수이면 오류가 발생하면서 문이 종료됩니다. start과 length의 합계가 expression의 문자 수보다 크면 start에서 시작하는 전체 값 식이 반환됩니다.
반환 형식
expression이 지원되는 문자 데이터 형식 중 하나이면 문자 데이터를 반환합니다. expression이 지원되는 binary 데이터 형식 중 하나이면 이진 데이터를 반환합니다. 반환되는 문자열은 다음 표에 표시된 항목을 제외하고 지정된 식과 같은 형식입니다.
지정된 식 |
반환 형식 |
---|---|
char/varchar/text |
varchar |
nchar/nvarchar/ntext |
nvarchar |
binary/varbinary/image |
varbinary |
주의
start와 length에 대한 값은 ntext, char 또는 varchar 데이터 형식의 경우 문자 수로 지정해야 하며 text, image, binary 또는 varbinary 데이터 형식의 경우 바이트로 지정해야 합니다.
start 또는 length에 2147483647보다 큰 값이 있는 경우 expression은 varchar(max) 또는 varbinary(max)여야 합니다.
보조 문자(서로게이트 쌍)
SC 데이터 정렬을 사용하는 경우 start와 length가 expression의 각 서로게이트 쌍을 단일 문자로 계산합니다. 자세한 내용은 데이터 정렬 및 유니코드 지원을 참조하십시오.
예
1.문자열과 SUBSTRING 사용
다음 예에서는 문자열의 일부를 반환하는 방법을 보여 줍니다. 이 쿼리는 Person 테이블에서 첫 번째 열에 이름을 반환하고 두 번째 열에 머리글자를 반환합니다.
USE AdventureWorks2012;
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의 둘째, 셋째, 넷째 문자를 표시하는 방법을 보여 줍니다.
SELECT x = SUBSTRING('abcdef', 2, 3);
결과 집합은 다음과 같습니다.
x
----------
bcd
(1 row(s) affected)
2.text, ntext, image 데이터와 SUBSTRING 사용
[!참고]
다음 예를 실행하려면 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의 결과를 보여 줍니다. 이 예제는 먼저 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')
,('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;