http://www.sqler.com/269782
안녕하세요?
MSSQL과 Oracle 함수를 비교하신 분들이 많은데요. 의외로 예제를 실어 놓은 곳이 거의 없더군요. 하여 준비해 보았습니다.
하지만, 한 번에 너무 많은 것을 올려놓으면 보기 힘들기에…
오늘은 그 첫번째 시간으로 문자열 중 10가지만 적어봅니다.
1. 문자 식에서 가장 왼쪽 문자의 ASCII 코드 값 반환 (숫자로 표시됨)
구분 |
MSSQL |
Oracle |
함수 |
ASCII |
ASCII |
용례 |
SELECT ASCII('A') |
SELECT ASCII('A') FROM DUAL |
결과 |
65 |
65 |
è MSSQL이든 ORacle이든 ‘’ 안에 여러 개의 문자가 있어도 가장 좌측 값만 반환합니다.
즉, SELECT ASCII(‘A’) 나 SELECT ASCII(‘ABCDEFG’) 나 결과는 같습니다.
2. 문자 합치기
구분 |
MSSQL |
Oracle |
함수 |
+ |
CONCAT 또는 || |
용례 |
SELECT '동해물과' + '백두산이' |
1. SELECT '동해물과 ' || '백두산이' FROM DUAL 2. SELECT CONCAT('동해물과 ','백두산이') FROM DUAL |
결과 |
동해물과 백두산이 |
동해물과 백두산이 |
3. ASCII 코드를 문자로 변환하기
구분 |
MSSQL |
Oracle |
함수 |
CHAR |
CHR |
용례 |
SELECT CHAR(67) |
SELECT CHR(67) FROM DUAL |
결과 |
C |
C |
è 참고로 9번은 TAB, 10은 LF(Line Feed), 13번은 CR(Carriage Return) 입니다.
4. 좌측에서 몇 번째에 해당 문자가 있는지 알려주기
구분 |
MSSQL |
Oracle |
함수 |
CHARINDEX |
INSTR |
용례 |
SELECT CHARINDEX('마이', '고마해라. 마이 무우따 아이가?') |
SELECT INSTR('고마해라. 마이 무우따 아이가?','마이' ) FROM DUAL |
결과 |
7 |
7 |
è MSSQL과 Oracle의 함수사용 순서가 다릅니다.
è MSSQL에는 패턴찾기에 PATINDEX를 많이 사용합니다. 위와 같은 결과를 얻으려면
SELECT PATINDEX('%마이%', '고마해라. 마이 무우따 아이가?')
처럼 사용하면 됩니다.(와일드 카드 사용 가능)
5. 대문자 변환, 소문자 변환
구분 |
MSSQL |
Oracle |
함수 |
UPPER / LOWER |
UPPER / LOWER |
용례 |
SELECT UPPER('aBcDeF'), LOWER('aBcDeF') |
SELECT UPPER('aBcDeF'), LOWER('aBcDeF') FROM DUAL |
결과 |
ABCDEF abcdef |
ABCDEF abcdef |
6. 좌측공간을 특정 문자로 채워주기
구분 |
MSSQL |
Oracle |
함수 |
지원하지 않음(없음) |
LPAD |
용례 |
- |
SELECT LPAD('13579',10, '0') FROM DUAL |
결과 |
- |
0000013579 |
è MSSQL에선 없는 함수이기 때문에 아래와 같이 사용자함수를 만들어서 사용하기도 합니다.
-- 1. FUNCTION 만들기 CREATE FUNCTION dbo.UFN_LPAD ( @INPUT VARCHAR(8000), @COUNT AS INT, @FILLCHAR AS CHAR(1)=' ' ) RETURNS varchar(200) AS BEGIN RETURN CASE WHEN LEN(@INPUT) >= @COUNT THEN LEFT(@INPUT, @COUNT) ELSE LEFT(REPLICATE(@FILLCHAR, @COUNT), @COUNT-LEN(@INPUT)) + @INPUT END END -- 2. SAMPLE SELECT dbo.UFN_LPAD('12',10,'0') AS PR_KEY --> 결과 0000000012
|
7. 우측공간을 특정 문자로 채워주기
구분 |
MSSQL |
Oracle |
함수 |
지원하지않음(없음) |
RPAD |
용례 |
- |
SELECT RPAD('13579',10, '0') FROM DUAL |
결과 |
- |
1357900000 |
è MSSQL에선 없는 함수이기 때문에 UFN_LPAD처럼 함수를 만들어서 씁니다.
다만, REPLICATE라는 함수가 있는데, 이것은 특정문자를 연속적으로 채워 줄 뿐, RPAD와는 조금 다릅니다.
-- 사용례 SELECT REPLICATE('0',10) --> 결과 0000000000 |
또한, SPACE라는 함수는 공백만 채워줍니다.
-- 사용례 SELECT '나의' + SPACE(10) + '것' --> 결과 나의 것 |
8. 좌/우 공백 없애주기
구분 |
MSSQL |
Oracle |
함수 |
LTRIM / RTRIM |
LTRIM / RTRIM |
용례 |
SELECT LTRIM(' 아버지'), RTRIM('어머니 ') |
SELECT LTRIM(' 아버지'), RTRIM('어머니 ') FROM DUAL |
결과 |
아버지 어머니 à (공백제거됨) |
아버지 어머니 à (공백제거됨) |
9. 문자의 음성표현을 가지는 문자열을 반환. 국내에서는 흔히 사용하지 않음(한글 동작 안함)
b, f, p, v = 1
c, g, j, k, q, s, x, z = 2
l = 4
m, n = 5
r = 6
구분 |
MSSQL |
Oracle |
함수 |
SOUNDEX |
SOUNDEX |
용례 |
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); |
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') FROM DUAL |
결과 |
S252 S200 |
S530 S530 |
è 어라? 예제에는 같은 것으로 되어 있는데, 실제 결과는 다르네요. -_- 이것 참…
10. 전체 문자열에서 지정한 길이만큼의 문자열 반환
구분 |
MSSQL |
Oracle |
함수 |
SUBSTRING |
SUBSTR |
용례 |
SELECT SUBSTRING('1234567890',4,5) |
SELECT SUBSTR('1234567890',4,5) FROM DUAL |
결과 |
45678 |
45678 |
è 4번째 자리에서 시작해서 다섯 글자를 가져옵니다.
오늘은 여기까지이고요, 조만간 2탄 올리겠습니다.
이상 [쓸만한게없네]였습니다.