본문 바로가기

IT Story/SQL Story

SQL 함수: 문자열 함수

문자열 연결, 형식 변환, 공백 제거, 치환 등이 있다.

 

문자열과 문자열 연결하기: CONCAT 함수

연결 연산자 +로 문자열을 연결하는 방법
SELECT symbol + ' : ' + comapny_name FROM nasdaq_company
CONCAT 함수로 문자열을 연결하는 방법
SELECT CONCAT('I', 'Love', 'SQL')

열에 적용할 때도 마찬가지다. 

CONCAT 함수로 열 이름과 문자열 연결
SELECT CONCAT (symbol, ' : ', company_name) FROM nasdaq_company

 

문자열과 숫자 또는 날짜 연결하기: CAST, CONVERT 함수

숫자형 데이터를 +로 연결하면 에러가 발생한다

CAST, CONVERT 함수는 숫자형이나 날짜형 등의 데이터를 문자열과 같은 자료형으로 변환할 수 있다. 

CAST 함수 사용법
 CAST (expression As datatype(length))

SELECT 

     CAST (ipo_year AS nvarchar(50))  + '  ' + CAST(open_price AS nvarchar(50))

FROM nasdaq_company WHERE symbol ='MSFT'

CONVERT 함수 사용법
 CONVERT (data_type[(length)], expression [, style])

SELECT 

       CONVERT (nvarchar(50), ipo_year)  + '  ' + CONVERT(nvarchar(50), open_price)

FROM nasdaq_company WHERE symbol ='MSFT'

 

NULL과 문자열 연결하기: ISNULL, COALESCE 함수

문자열과 연결하려는 값이 NULL이면, 결과는 NULL로 반환된다. 따라서, 테이블에 NULL이 있다면 문자열 또는 숫자로 자료형을 변환해야 한다. NULL은 ISNULL함수나  COALESCE 함수로 자료형을 변환한다. 

ISNULL 함수의 형 변환 기본 형식
 ISNULL (check_expression, replacement_value)

SELECT symbol, sector, industry, open_price FROM nasdaq_company WHERE symbol ='DBA'

결과

symbol  sector  industry  open_price
DBA      NULL   NULL     19.3400001525879

 

SELECT symbol, isnull (sector, ''),  open_price FROM nasdaq_company WHERE symbol ='DBA'

isnull (sector, ''): sector에 NULL이 있으면 공백으로 대체

결과

symbol    (열 이름 없음)  open_price
DBA                                  19.3400001525879

 

SELECT symbol, isnull (sector, industry), industry, open_price FROM nasdaq_company WHERE symbol ='DBA'

 isnull (sector, industry): sector에 NULL이 있으면 industry 로 대체

결과

symbol   (열 이름 없음)  industry    open_price
DBA       NULL                 NULL       19.3400001525879

 

SELECT symbol, coalesce (sector, industry, open_price), industry, open_price FROM nasdaq_company WHERE symbol ='DBA'

coalesce (sector, industry, open_price): 첫번째 인자(sector)로 전달한 값이 NULL일 때, 다음 인자(industry)가 NULL이면, 그 다음 인자(open_price )를 차례로 대입

결과

symbol    (열 이름 없음)                   industry           open_price
DBA       19.3400001525879          NULL             19.3400001525879

 

문자열을 소문자나 대문자로 변경하기: LOWER, UPPER 함수

SELECT 'Do it SQL', LOWER( 'Do it SQL'), UPPER ( 'Do it SQL')

결과

(열 이름 없음) (열 이름 없음) (열 이름 없음)
Do it SQL         do it sql             DO IT SQL

 

문자열 공백 제거하기: LTRIM, RTRIM, TRIM 함수

LTRIM: 좌측 공백 제거, RTRIM: 우측 공백 제거, TRIM: 양측 공백 제거

SELECT

     '           Do it SQL', LTRIM( '           Do it SQL'),  

     'Do it SQL           ', RTRIM( 'Do it SQL           '),

     '           Do it SQL           ', TRIM(            'Do it SQL           ')

TRIM의 또 다른 기능은 단어 앞, 뒤에 있는 공백과 마침표를 제거하는 것이다. 

공백 제거 기능은 LTRM, RTRIM에는 없다.

SELECT TRIM( '. , !  '    FROM   '         #         Do it ! SQL      .')  

결과

#         Do it! SQL

 

문자열 길이 반환하기: LEN 함수

LEN 함수는 문자 개수를 셀 때 앞의 공백은 포함하지만 뒤 공백은 포함하지 않는다. 

SELECT LEN( '         Do it ! SQL'),   LEN( ' Do it ! SQL       ')

결과

(열 이름 없음) (열 이름 없음)
20                       12

SELECT LEN( ), company_name FROM nasdaq_company

결과

(열 이름 없음)     company_name
31                         CMC Crypto 200 Index by Solacti
28                         Dow Jones Industrial Average
8                           FTSE 100
7                          S&P 500
16                        NASDAQ Composite
10                        Nikkei 225

 

특정 문자까지 문자열 길이 반환하기: CHARINDEX 함수

CHARINDEX 함수는 지정한 특정 문자까지의 길이를 반환한다. 

SELECT  'Do it!! SQL', CHARINDEX ( '!', 'Do it!! SQL')

→'!'까지 문자열 길이 반환

결과

(열 이름 없음) (열 이름 없음)
Do it!! SQL       6

※ 지정한 문자가 탐색 대상 문자열에 없으면 0을 반환한다.

 

지정한 길이만큼 문자열 반환하기: LEFT, RIGHT 함수

LEFT, RIGHT 함수는 문자열 왼쪽 또는 오른쪽에서 시작해 정의한 위치까지 문자열을 반환한다.

1 2 3 4 5 6 7
D o i t S Q L

SELECT  'Do it!! SQL', LEFT('Do it!! SQL', 2), RIGHT ('Do it!! SQL', 2)

결과

(열 이름 없음) (열 이름 없음) (열 이름 없음)
Do it!! SQL            Do                     QL

 

지정한 범위의 문자열 반환하기:  SUBSTRING 함수

SUBSTRING 함수는  지정한 범위의 문자열을 반환한다. 2번째 인자에는 시작 범위를, 3번째 인자에는 시작 위치부터 반환할 문자 개수를 입력한다.

SUBSTRING 함수 사용법
 SUBSTRING expression, start, length)

SELECT  'Do it!! SQL', SUBSTRING( 'Do it!! SQL', 4, 2)

결과

(열 이름 없음) (열 이름 없음)
Do it!! SQL           it

 

SUBSTRING 함수는  열 이름을 전달해 사용할 수도 있다.

SELECT  SUBSTRING(company_name, 2, 3), company_name  FROM nasdaq_company

결과

(열 이름 없음)  company_name
MC                   CMC Crypto 200 Index by Solacti
ow                    Dow Jones Industrial Average
TSE                 FTSE 100
&P                   S&P 500
ASD                NASDAQ Composite
ikk                   Nikkei 225

 

SUBSTRING 함수는 CHARINDEX 함수를 조합해 사용하는 경우가 많다. 다음은 CHARINDEX 함수로 @까지 위치를 계산한 다음 그 값을 SUBSTRING 함수에 사용해 @바로 앞까지의 문자열을 검색하는 쿼리이다.

SELECT  SUBSTRING('email@email.com', 1, CHARINDEX ('@', 'email@email.com') -1)

결과

(열 이름 없음)
email

 

특정 문자를 다른 문자로 변경하기:  REPLACE 함수

1번째 인자는 열 또는 문자를 입력하고, 2번째 인자는 변경하려는 문자열을 , 3번째 인자는 변경 문자를 입력한다.

REPLACE 함수 사용법
 REPLACE(string_expression, string_pattern, string_replacement)

SELECT  REPLACE'(symbol, 'A', 'C'), symbol

FROM nasdaq_company WHERE symbol LIKE '%A%'

결과 

(열 이름 없음)  symbol
C                        A
CC                    AA
CCC                 AAC
CCCG              AACG
CCCIU             AACIU

 

문자 반복하기:  REPLICATE 함수

반복할 문자와 반복 횟수를 인자로 전달한다.

REPLICATE 함수 사용법
 REPLICATE(string_expression, integer_expression)

SELECT  REPLICATE('0', 10)

결과 

(열 이름 없음)
0000000000

SELECT  REPLACE (symbol, 'A', REPLICATE( 'C', 10)), symbol

 

FROM nasdaq_company WHERE symbol LIKE '%A%'

→ 문자 A를 C로 바꾸되 10번 반복하라.

결과 

(열 이름 없음)                                                  symbol
CCCCCCCCCC                                                A
CCCCCCCCCCCCCCCCCCCC                 AA
CCCCCCCCCCCCCCCCCCCCC              AAC
CCCCCCCCCCCCCCCCCCCCCG           AACG
CCCCCCCCCCCCCCCCCCCCCIU          AACIU

 

공백 문자 반복하기:  SPACE 함수

SELECT symbol + SPACE(10) + company_name FROM nasdaq_company

symbol과 company_name을 결합하되 사이에 공백을 10개 띄워라

결과 

(열 이름 없음)
^CMC200          CMC Crypto 200 Index by Solacti
^DJI          Dow Jones Industrial Average
^FTSE          FTSE 100
^GSPC          S&P 500
^IXIC          NASDAQ Composite

 

문자열 연숙으로 표시하기:  REVERSE 함수

REVERSE 함수는 문자열을 거꾸로 정렬하는 함수이다. 다양한 문자열 함수와 혼합하면 이메일에서 도메인의 자릿수 구하기나 다음 예제에서 다루는 IP  대역 구하기 등 다양하게 활용할 수 있다. 

SELECT  'Do it! SQL', REVERSE( 'Do it! SQL')

결과 

(열 이름 없음) (열 이름 없음)
Do it! SQL         LQS !ti oD

 

예) IP  address의 3번째 부분 정보까지 검색하라

WITH ip_list(ip)

AS (

SELECT '192.168.9.1' UNION ALL

SELECT '10.6. 100.99' UNION ALL

SELECT '8.8.8.8' UNION ALL

SELECT '192.100.212.113' 

)

SELECT ip, SUBSTRING(ip, 1, LEN(ip) - CHARINDEX('.', REVERSE(ip)))

FROM ip_list

해석:

 SELECT '192.168.9.1', CHARINDEX('.', '192.168.9.1')  → '192.' 반환, 결과 4

 SELECT '192.168.9.1', CHARINDEX('.', REVERSE('192.168.9.1')): → '1.' 반환, 결과 2

LEN(ip) - CHARINDEX('.', REVERSE(ip)): ip 전체 길이에서 마지막 '.'의 자릿수를 뺀 길이를 반환 

결과 

ip                             (열 이름 없음)
192.168.9.1             192.168.9
10.6. 100.99            10.6. 100
8.8.8.8                      8.8.8
192.100.212.113    192.100.212

 

지정한 범위의 문자열을 삭제하고 새 문자열 끼워넣기: STUFF 함수

STUFF 함수는 지정한 범위의 문자를 삭제하고, 새 문자열을 끼워 넣는다. 

SELECT STUFF ('Do it! XX SQL Server', 8, 2, N'마이크로소프트')

→ 8번째에 위치한 X부터 2글자를 삭제하고, '마이크로소프트' 글자를 끼워넣어라  

결과 

(열 이름 없음)
Do it! 마이크로소프트 SQL Server

 

숫자를 문자열로 변환하기: STR 함수

STR 함수는 CAT, CONVERT 함수처럼 숫자를 문자열로 변환한다. 다만 STR 함수만의 특징인 2번째 인자로 전달하는 변환 길잇값이 변경할 문자열 길이보다 짧은 경우 오른쪽 맞춤 정렬한다는 것과, 3번째 인자로 전달하는 소수 부분의 길이에 맞게 반올림해 표현한다는 것이다.

SELECT STR(123.45, 6, 1)

→ 123.45는 길이 6으로, 소수 부분은 길이1로 변환하라

SELECT STR(123.45, 2, 2)

결과 

(열 이름 없음)
**

→ 변환길이가 변경할 문자열 길이보다 짧으면 변환 길잇값 만큼 *로 반환한다.변환 길잇값은 2이고 변경할 문자열의 길이가 5이므로 **를 반환한다. 

 

퀴즈1. nasdaq_compnay 테이블에서 company_name 열의 데이터 중 마침표(.)를 포함하는 데이터를 검색해 .를 ****로 변경하세요.
SELECT company_name, 
REPLACE(company_name, SUBSTRING(company_name,CHARINDEX('.', company_name) +1, 
LEN(company_name)), '****')  as company_name1

FROM nasdaq_company
WHERE company_name like '%.%'

→ 해석: WHERE(... '%.%)': company_name 열의 데이터 중 마침표(.)를 포함하는 조건으로 데이터를 검색해,

REPLACE(열, 변경전 문자('.'), 변경후 문자('****')) 문을 이용해 하는데, 

변경전 문자 부분을 SUBSTRING(열, start, length) 함수를 이용해 지정 문자('.')의 시작 위치부터 그 이후까지의 길이(LEN())를 반환받는다. 지정 문자('.')의 시작 위치는 CHARINDEX('.', 열) 함수를 이용한다.

 

결과 

company_name                                                               company_name1
Agilent Technologies Inc. Common Stock                    Agilent Technologies Inc.****
Armada Acquisition Corp. I Unit                                    Armada Acquisition Corp.****
Artius Acquisition Inc. Class A Common Stock           Artius Acquisition Inc.****
Artius Acquisition Inc. Unit                                              Artius Acquisition Inc.****
Aadi Bioscience Inc. Common Stock                           Aadi Bioscience Inc.****

'IT Story > SQL Story' 카테고리의 다른 글

SQL 함수: 집계 함수  (0) 2022.12.05
SQL 함수: 날짜 함수  (0) 2022.12.02
공통 테이블 식(Common Table Expression, CTE)  (0) 2022.12.01
서브 쿼리  (0) 2022.11.30
조인(Join): 외부 조인  (0) 2022.11.29