'SQL'에 해당되는 글 4건
- 2010.11.03 ORA-00604: 순환 SQL 레벨 1에 오류가 발생했습니다. ORA-01000: 최대 열기 커서 수를 초과했습니다.
- 2010.03.22 SQL-Server에서 IF문 대신 많이 사용되는 CASE문 활용법.
- 2010.03.22 SQL Server에서 저장프로시저 디버깅하기. 1
- 2009.06.09 SQL SERVER와 ODBC 연결이 안되는 경우 방화벽 설정하는 법
SQL Server에서 쿼리문 작성시 IF문을 종종 사용한다.
하지만 SELECT문 안에서는 IF문을 사용할 수가 없어 답답한 경우가 많다.
SQL Server에서는 SELECT문에서 IF문을 사용할 수 없는 대신 CASE문을 제공하고 있다. CASE문을 사용하면 SELECT문안에서도 IF문의 효과를 누릴 수 있다.
CASE 함수는 다중 IF문과 같은 구조를 가진다. 더불어 SELECT 구문 같은 DML과 연동을 해서 행 단위의 조건 처리가 가능하다는 특징을 가지고 있기 때문에 복잡한 쿼리 작성 시에 필수적으로 사용된다.
기본적인 구문>
1. CASE 함수는 지정된 조건식을 평가하고, 조건에 만족하는 결과 중 하나를 리턴한다.
2. CASE 함수는 다음과 같은 항목들로 구성된다.
CASE 키워드
변환할 열 이름
검색할 식을 지정하는 WHEN절 및 이를 바꿀 식을 지정하는 THEN 절
END 키워드
CASE 함수의 별칭을 정의하는 선택적 AS 절
형식별 CASE 함수>
1. 단순 CASE 함수
- 조건식이 한 번만 지정되고 WHEN절에는 조건식과 비교할 상수값만 선언한다. 각각의 WHEN절을 비교해 조건에 만족하면 THEN절 다음의 구문이 실행된다.
syntax 1.
CASE input_expression!
WHEN when_expressionŋ THEN result_expressionŋ
WHEN when_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END
2. 검색된 CASE 함수 (CASE 절에는 아무런 조건식도 오지 않는다)
- 각 WHEN절에 필요한 조건식을 별도로 지정할 수 있다.조건이 만족하면 THEN절 다음에 명령이 실행된다.
syntax 2.
CASE
WHEN Boolean_expressionŋ THEN result_expressionŋ
WHEN Boolean_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END
NOTE: THEN절 다음에는 일반 상수값 뿐만 아니라 함수나 심지어 또 다른 쿼리문이 올 수도 있다. 반드시 잊지 말 것은 result_expression!은 반드시 하나의 값을 리턴해야 한다는 것이다. 하지만 행 단위로 각각의 검색 조건이 반복 실행되므로, 성능에 관한한 최상의 결과를 얻기는 힘들다.
예제>
- 여기서 CASE문은 컬럼에 표시할 때 조건에 따라 다르게 표시하도록 조건을 줄 때 사용하였다.
SELECT [Name], SocID, PayFlag, PayDate, SUM(PayAmount) AS PayAmount
FROM (
SELECT P.[Name] AS [Name], P.SocID AS SocID, AP.PayFlag, CONVERT(VARCHAR(10), AP.UserPayDate, 121) AS PayDate,
(CASE
WHEN (AP.Cash+AP.Card) < AP.Cost03 THEN (AP.Cash+AP.Card)-AP.Cost01
WHEN (AP.Cash+AP.Card) >= AP.Cost03 THEN AP.Cost03
END) AS PayAmount
FROM xdo_AccountPay AP
INNER JOIN xdo_Account A ON A.AccountID = AP.AccountID
INNER JOIN xdo_Patient P ON P.PatientID = A.PatientID
WHERE AP.Cost03 > 0
AND (CONVERT(VARCHAR(10), AP.UserPayDate, 121) BETWEEN @csBeginPayDate AND @csEndPayDate)
AND AP.PayFlag = 9
) AS SUBMAIN
GROUP BY [Name], SocID, PayFlag, PayDate
ORDER BY PayDate
CASE를 사용한 조건 데이터 처리>
- 실제로 CASE문을 필요로 하는 것은 바로 DML 명령들이다. select 구문을 처리되는 집합 중 특정 컬럼값에 기초한 조건을 기준으로 테이블에는 없지만 새로운 집합에 포함돼야 할 컬럼을 새로 생성하고, 그 컬럼값을 추출, 가공, 연산하는 용도로 곧잘 사용된다. 즉 select되는 각각의 행(row, record)에 대해 조건을 부여하고 조건에 만족하는 결과를 새로운 컬럼값에 할당하는 것이다. CASE문을 조건 데이터 처리와 함께 사용한 경우에 두 가지 특징을 볼 수 있다.
CASE의 특징
1. 행 단위의 조건 처리가 가능
2. 새로운 컬럼 생성
CASE 함수는 다양한 상황의 문제 해결에 활용될 수 있다. 참고로 T-SQL에는 CASE와 유사한 COALESCE()함수가 있다.
응용프로그램과 연동된 저장프로시저를 디버깅하고 싶어 자료를 찾던 중 데브피아에서 발견한 문서입니다. 쿼리분석기에 저장프로시저의 디버그가 있지만 그것보단 프로필러를 사용한 방법이 더 쉽고 보기 편한 것 같아 올립니다.
출처: 데브피아.
서버 PC와 ODBC 연결을 할 때 모든 설정 다 맞는데 클라이언트에서 ODBC를 연결하려고 하면 이런 메시지가 뜨면서 연결할수 없다고 나올때가 있다.
이럴 때는 연결하고자 하는 SQL서버 PC의 방화벽에서 포트를 열어주어야 한다.
[제어판] -> [Windows 방화벽] -> [고급] -> [네트워크 연결설정]에서 "로컬 영역 연결"을 선택한 후 [설정]을 클릭한다.
[추가]버튼을 클릭한다.
각 정보를 입력한 뒤 [확인]을 클릭한다.
- IP주소는 서버 PC의 주소를 넣는다.
"SQL 서버"항목이 추가되고 체크된 것을 볼 수 있다.
[확인]을 눌러 저장하고 Client에서 연결을 시도하면 성공되는 것을 확인할 수 있다.