SQL Server 2012 버전부터 FORMAT 함수가 추가되었다. 오라클에서는 TO_CHAR 함수를 사용하여 날짜 형식을 문자열로 쉽게 변환을 할 수 있고, MSSQL에서는 CONVER 함수를 사용하여 변환이 가능하지만 조금 아쉬운 면이 있었다. FORMAT 함수를 사용하여 오라클의 TO_CHAR 함수에서 가능했던 3가지 사용법을 소개한다. 날짜 문자열 변환 수치값 천단위 콤마 찍기 수치값 소수점 표시 날짜 문자열 변환 SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') AS result1 , FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') AS result2 오라클에서 날짜를 문자열로 변환하던 비슷한 형식으로 사용이 가능하다. SELECT FORMAT(..
SQL Server 2012 버전부터 IIF 함수가 추가되었다. CASE 문을 사용하면 쿼리문이 조금 복잡해지는 부분이 있는데 2가지의 값만 리턴이 필요하다면 IIF 함수가 조금 더 효율적일 수 있다. 오라클의 DECODE 함수처럼 조금 함축적으로 쿼리문을 작성할 수 있지만 MSSQL에 종속된 함수이다. IIF 함수는 참과 거짓 두 경우의 값만 리턴이 가능하다. DECLARE @score INT = 80 SELECT IIF(@score >= 70, '합격', '불합격') AS score 더 많은 조건식을 사용하기 위해서는 CASE 문을 사용해야 한다. IS NULL 등 다양한 조건식이 사용가능 하다. DECLARE @score INT = NULL SELECT IIF(@score IS NULL, '미입력'..
SQL Server에서는 NULL 값을 치환하기 위해서는 ISNULL 함수를 사용한다. 오라클에서 NVL 함수와 MySQL의 IFNULL 함수와 동일한 기능을 수행한다. 오라클의 NVL2와 동일한 함수는 없지만, IIF 함수 또는 CASE 문을 활용하여 비슷한 기능을 수행할 수 있으니 아래의 예제를 참고하면 도움이 될 수 있다. 숫자 NULL 치환 WITH emp AS ( SELECT 'JONES' AS ename, 3000 AS salary, NULL AS retire UNION ALL SELECT 'SCOTT' AS ename, NULl AS salary, 'Y' AS retire ) SELECT ename , salary , ISNULL(salary, 0) AS sal FROM emp 급여(sala..
SQL Server 2012 버전부터 CHOOSE 함수가 추가되었다. CHOOSE 함수는 첫 번째 인자의 인덱스에 해당하는 값을 리턴하는 함수이다. CASE 문으로도 비슷한 결과를 만들 수 있지만, 인덱스에 대한 단순 값을 반환할 경우 CHOOSE 함수를 사용하면 쿼리문이 조금 더 단순해질 수 있다. CHOOSE ( index, val_1, val_2 [, val_n ] ) SELECT CHOOSE(1, 'A', 'B', 'C') AS result1 , CHOOSE(2, 'A', 'B', 'C') AS result2 , CHOOSE(4, 'A', 'B', 'C') AS result3 첫번째 인자의 인덱스에 해당하는 순서의 값을 리턴한다. 인덱스에 해당하는 값이 없으면 NULL을 리턴한다. SELECT D..
SQL Server 2017 버전부터 TRANSLATE 함수를 사용할 수 있게 되었다. 오라클에서는 오래전 부터 사용이 가능했지만 MSSQL에서는 신규로 추가된 함수이다. REPLACE 함수를 사용하여 여러 개의 문자를 치환하기 위해서는 REPLACE 함수를 중첩해서 사용해야 하는데, 이런 경우 쿼리문이 복잡해진다. TRANSLATE 함수를 사용하여 여러 개의 문자를 치환하는 것은 간단하지만, 치환하지 않고 제거는 쉽지 않기 때문에 이런 경우는 REPLACE 함수를 사용하는 것이 효율적일 수 있다. TRANSLATE("문자열", "바꿀문자", "변환문자") 바꿀문자와 변환문자의 길이는 동일해야한다. 문자열에 바꿀문자가 있을 경우 바꿀문자의 자리수에 해당하는 변환문자로 치환된다. TRANSLATE 함수는 ..
SQL Server 2012 버전부터 FORMAT() 함수를 사용하여 소수점의 형식을 변경할 수 있는 기능이 추가 되었다. 오라클 SQL의 TO_CHAR 함수와 FM을 사용하는 방법과 비슷하다. SQL Server 2012 이전 버전에서는 DECIMAL 형의 값을 FLOAT 형으로 변환하는 방법으로 소수점 이하의 0값을 제거하였지만, FORMAT 함수를 사용하면 간편하게 변환이 가능하다. SELECT FORMAT(123.456700, '##0.######') AS result 주의할 점은 숫자의 최대 자리수와 포맷(# or 0)의 길이가 일치해야 한다. 만약 소수점 이하의 값의 길이보다 "#"의 길이가 짧으면 해당 위치에서 반올림하여 표시한다. #은 수치값의 "0"을 제거하고, "0"은 해당 자리에 "0..
SQL Server 2012 버전부터 월의 마지막 일자를 구할 수 있는 EOMONTH() 함수가 추가되었다. 오라클 SQL의 LAST_DAY와 동일한 기능을 수행하는 함수이다. 월의 마지막 날짜 구하기 (SQL Server 2012 이상) SELECT EOMONTH('2020-09-09') AS result SQL Server 2012 버전부터 EOMONTH (End of Month) 함수를 사용하여 간편하게 해당 일자 기준으로 해당 월의 마지막 날짜를 구할 수 있다. 월의 마지막 날짜 구하기 (SQL Server 모든 버전) SELECT DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, '2020-09-09') + 1, 0)) AS result SELECT..
SQL Server에서 CHARINDEX() 함수는 문자열에서 특정 문자를 찾고 위치를 반환한는 함수이다. 오라클 SQL의 INSTR 함수와는 다르게 뒤에서 부터 찾는 기능은 지원하지 않고, 문자열의 앞부터 또는 특정 위치부터 문자를 검색한다. CHARINDEX("찾을문자", "문자열", "시작위치") 찾을 문자가 존재하면 위치를 리턴하고, 존재하지 않으면 "0"을 리턴한다. 기본 사용법 SELECT CHARINDEX('sql', 'Microsoft SQL Server') 대소문자 구분없이 'sql' 문자를 찾아서 위치를 리턴하다. 시작위치를 생략하면 첫번째 문자부터 찾는다. 시작위치를 지정하여 찾기 SELECT CHARINDEX('sql', 'Microsoft SQL Server', 11) 문자열의 1..
SQL Server 2016 버전 부터 JSON 문자열의 특수문자를 Escape 처리를 할 수 있는 STRING_ESCAPE() 함수가 추가 되었다. 모든 문자열에 사용 가능하지만 현재는, json에서 사용하는 특수문자만 지원한다. STRING_ESCAPE("문자열", "유형") 현재 유형은 "json"만 지원함 json 문자열 자체를 Escape 처리하는 것이 아니라, json에 사용할 문자열 값을 Escape 처리하는 기능임 SELECT STRING_ESCAPE('"젠트"의 프로그래밍세상','json') AS result SELECT STRING_ESCAPE('https://gent.tistory.com/','json') AS result DECLARE @site VARCHAR(100) = '"젠트"..
SQL Server 2017 이상의 버전에서는 여러 행의 컬럼 값을 하나의 컬럼으로 합칠 때에는 STRING_AGG() 함수를 사용하면 된다. 오라클 SQL의 LISTAGG() 함수와 비슷한 기능을 수행한다. SQL Server 2017 이전 버전을 사용한다면 FOR XML PATH 서브 쿼리를 사용해야 한다. [MSSQL] 여러 행의 컬럼을 합치는 방법 (STUFF, FOR XML PATH) STRING_AGG 함수는 GROUP BY 절과 함께 사용해야 한다. ORDER BY 절을 사용하여 정렬이 가능하며 ORDER BY 절은 생략할 수 있다. STRING_AGG("합칠컬럼명", "구분자") WITHIN GROUP(ORDER BY "컬럼명") 기본 사용법 SELECT job , STRING_AGG(en..