반응형
SMALL

DB 39

DB 정렬 ORDER BY 관련

DB 조회 구문을 만들때 ORDER BY를 사용하다가 아무렇지 않게 실수하는 경우가 있다. 아래 두구문의 같은 값인것 같지만 결과는 다르게 나온다. 왜 그럴까? 그건 바로 DATA 타입 때문이다. 위에 구문은 SEQ가 문자형이고 아래는 숫자형이다. 쿼리에 자신있다고 하다가 결과도 보지 않고 담당자와 이야기 하다가 결과가 이상한데요 라는 부끄러운 결과를 볼수 있다. 자만하지 말고 자신이 만든 쿼리를 항상 테스트 하는 습관을 기르도록 하자 예시1) WITH TMPTABLE AS ( SELECT '1' AS SEQ UNION ALL SELECT '2' AS SEQ UNION ALL SELECT '10' AS SEQ UNION ALL SELECT '11' AS SEQ ) SELECT * FROM TMPTABLE..

DB 2024.03.07

WHERE 조건에 CASE문 처리

사용법만 알면 자주 사용하게 되는것중에 하나가 WHERE 조건에 CASE문을 넣으로 조건에 맞으면 조건절 실행 DECLARE @PARAFLAG VARCHAR(MAX) = 'Y' SELECT AA, BB, CC, DD FROM TEMPTABLE WHERE 1 = CASE WHEN @PARAFLAG = 'Y' THEN 1 ELSE CASE WHEN THEN CC = 'TYPE' ELSE 1 ELSE 0 END END 받은 변수DATA가 Y인경우 CC컬럼의 값이 TYPE인 DATA를 가져옴 Y가 아닌경우 WHERE 조건절은 1 = 1 로 전체 검색을 한다. 사용방법에 따라 유용하게 쓰인다.

DB 2024.03.07

[MSSQL] STUFF() / FOR XML PATH()

STUFF 문자열의 위치와 길이를 지정하여 다른 문자로 치환하는 함수 STUFF(문자열, 위치, 길이, 치환할 문자) FOR XML PATH 쿼리의 결과 데이터를 XML 형태로 표현 FOR XML PATH('row element명') 예제) WITH TEST_TABLE AS ( SELECT 1 as seq, '햄버거' AS name UNION ALL SELECT 1 as seq, '부대찌개' AS name UNION ALL SELECT 2 as seq, '된장찌개' AS name UNION ALL SELECT 2 as seq, '소고기전골' AS name UNION ALL SELECT 3 as seq, '라면' AS name ) SELECT Name FROM TEST_TABLE FOR XML PATH('..

DB 2024.03.05

오라클 HINT

◆ 개요 힌트는 SQL 튜닝의 핵심부분으로 일종의 지시구문이다. SQL에 포함되어 쓰여져 Optimizer의 실행 계획을 원하는 대로 바꿀 수 있게 해준다. 오라클 Optimizer라고 해서 항상 최선의 실행 계획을 수립할 수는 없으므로 테이블이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이다. 사용자는 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지에 대해 알고 있는데 이 경우 오라클 서버의 Optimizer에 의존하여 나온 실행 계획보다 훨씬 효율적인 실행 계획을 사용자가 구사할 수 있다. ◆ 사용 힌트를 사용하여 아래와 같은 것들을 할 수 있다. 액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표(Goal)를 변경 가능하다. ◆ 오라클 힌트 사용..

DB 2024.03.05

소수점 처리 방법 및 계산시 유의점

소수점 자리 처리는 아래와 같다. 올림 : CEIL EX ) SELECT CEIL([숫자컬럼]) AS [컬럼명칭] FROM [테이블명] 반올림 : ROUND EX ) SELECT ROUND([숫자컬럼], [자릿수]) AS [컬럼명칭] FROM [테이블명] 버림 : TRUNC EX ) SELECT TRUNC([숫자컬럼].[자릿수]) AS [컬럼명칭] FROM [테이블명] DB에서 소수점 처리도 중요하지만 나누기 할때 더 신경써야 한다. 분모는 항상 0인경우를 0나누기 오류가 발생한다. EX ) SELECT CASE WHEN ISNULL([분모],0) = 0 THEN 0 ELSE [분자] / [분모] END FROM [테이블명] 나누기를 소수점으로 표현하고 싶으면 분모를 소수점 표현한 후에 나누어 주면 된다.

DB 2024.03.02

테이블 구조를 변경하고자 할때

MSSQL 사용하는 프로젝트를 뛰고 있어서 MSSQL로 작성해보았다. 계속해서 DATA 가 쌓이는 경우가 아니라면 항상 백업으로 DATA를 만들고 테이블을 다시 생성후 백업한 DATA를 넣는게 좋다 개발할때 항상 유용하게 사용하는 방법을 공유하고자 한다. 컬럼 하나를 추가하는데 초심자들은 DROP 해서 DATA도 삭제하는 경우가 많은데 물어보면 DATA 옮기는게 힘들거나 귀찮다는 분들이 있는데 아래의 방법으로 귀찮더라도 생활하 하자 나의 경우는 3번과 5번을 동일 편집기에 넣고 실행시킨다. 1번부터 4번까지 하는데 익숙해 지면 2분도 걸리지 않는다. 1. DATA백업 SELECT * INTO TMPTTABLE FROM TTABLE 2. 테이블 스키마 생성 테이블 마우스 우클릭 -> 테이블 스크립트 -> ..

DB 2024.03.01

프로시져 오류처리 방법

MSSQL 프로시져를 만들었을때 오류 처리 해주는게 좋지 않을까한다. SELECT 문은 필요로 하지 않지만 CURSOR를 통해서 INSERT문 DELETE문을 만들때는 TRY구문으로 오류처리 해주기를 바란다. TRY CATCH문을 사용하여 오류가 발생시에 PRINT문으로 찍어보거나 실행내용을 DB에 남기는 방법중 하나를 택하기 바란다. DB에는 컬럼을 상황에 맞게끔 CLOB, BLOB 형태로 만드는게 좋으며 나는 DB만드는게 귀찮다 하시면 PRINT를 찍어도 무방함 EX===================================================== BEGIN CATCH IF ERROR_STATE() = 1 BEGIN SELECT @P_LOG = '[ERROR]NUMBER : ' + CON..

DB 2024.02.29

[MSSQL] RNAK() 함수 SEQ를 주거나 순위를 매길때

순위를 매기고 싶을때 사용 동일한 순위를 매긴후 담음순위를 동일순위만큼 건너뛰고 줄때 RANK() OVER(ORDER BY 점수)) WITH CTE AS ( SELECT 100 AS A UNION SELECT 90 AS A UNION SELECT 90 AS A UNION SELECT 90 AS A UNION SELECT 90 AS A UNION SELECT 70 AS A UNION ) SELECT RANK() OVER(ORDER BY A) FROM CTE 1 100 2 90 2 90 2 90 5 80 6 70 동일한 순위를 매긴후 다음순위를 연속적으로 줄때 DENSE_RANK() OVER(ORDER BY 점수)) WITH CTE AS ( SELECT 100 AS A UNION SELECT 90 AS A ..

DB 2024.02.26

UNPIVOT 숫자 형 변환 오류

UNPIVOT 목록에 지정된 다른 열의 유형과 충돌합니다. 라는 문제가 발생함 이유는 UNPIVOT 대상 컬럼 모두 동일한 데이터 타입을 가져야 하는 문제 E컬럼과 + F컬럼을 더해서 G컬럼으로 만들다 보니 발생된 문제로 UNPIVOT대상은 모두 CAST하여 형변환해줘야 함 EX========================================================================== WITH XTEMP AS ( SELECT A,B,C,D , CAST(E AS DECIMAL) MATCOST , CAST(F AS INT) LABCOST , CAST(ISNULL(A,0) + ISNULL(B,0) AS INT) AS G FROM A ) SELECT A,B,C,D,AAA, VALUE F..

DB 2024.02.25

MSSQL 과 ORACLE 함수 비교

MSSQL과 Oracle 함수 비교 SQL 2014.10.22 23:47 Posted by 목간쥐 고무고무 인간 블로그에서 퍼온글 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..

DB 2024.02.25
반응형
LIST