[MSSQL] 문자열 계산식에서의 null의 취급

MS SQL | 2011. 2. 11. 19:32
Posted by Haronoid
SQL 서버에서는 문자열 컬럼을 계산식에서 사용할 떄 값이 null을 갖을 경우 결과는 null을 돌려주게 된다.
ORACLE에서는 null은 공백문자와 같은 취급이기 때문에 null은 그냥 공백문자 취급이 되지만 MS SQL Server에서는 다른 결과를 돌려주기 때문에 주의해야 한다.

 MS SQL 서버에서 실행
  SQL1 : select 'a' + null + 'b'
  SQL2 : select 'a' + '' + 'b'

> 결과
  SQL1 <- null
  SQL2 <- 'ab'
  • 문자열 계산식에서 값에 null이 있기 때문에 결과는 null이 된다.
ORACLE에서의 예
  SQL1 : select 'a' + null + 'b' from dual;
  SQL2 : select 'a' + '' + 'b' from dual;

> 결과
  SQL1 <- 'ab'
  SQL2 <- 'ab'
  • ORACLE에서는 null의 문자열계산은 null을''로 치환한 결과가 된다.
 
SQL서버에서도 SELECT문의 결과를 새로운 테이블을 작성해 데이터를 넣을 수 있다.
정확히는 없으면 많들어 넣고, 있으면 그냥 투입하기 떄문에 오라클의 그것보다 강력한 기능이긴 하다.
ORACLE에서는CREATE TABLE NEW_TBL1 AS SELECT * FROM TBL2의 방식이 되는데, SQL 서버에서는 이하의 방법으로 사용하게 된다.
SELECT * INTO NEW_TBL1 FROM TBL2;
  • 결과 TBL2의 전 항목이 NEW_TBL1에 새로 투입되게 된다.
    PK,Index나Triger등은 작성되지 않지만, 각 컬럼의 속성들은 그대로 작성된다.
    컬럼의 속성,Identity,NULL등의 속성은 그대로 계승

 

[MSSQL]SQL Server의Minus、Except

MS SQL | 2011. 2. 11. 19:18
Posted by Haronoid
1. Oracle의MINUS연산자가 SQL Server에는 존재하지 않는다.
대신이라고 하긴 조금 틀리지만EXCEPT라는 연산자가 있어, 약간은 비슷한 처리를 할 수 있다.
EXCEPT : 왼쪽의 쿼리에 있고, 오른쪽 쿼리에 없는 각 값을 돌려준다.
insert into TBL1 values ('1');
insert into TBL1 values ('2');
insert into TBL1 values ('3');
insert into TBL2 values ('1');
insert into TBL2 values ('3');

select * from TBL1
EXCEPT
select * from TBL2

>결과
2
  • 위의 예로는 MINUS와 같은 결과가 된다.
2. 왼쪽 쿼리의 결과에 오른쪽 쿼리가 복수의 일치하는 값을 갖고 있을경우엔 MINUS와는 다른 결과가 되고 만다.
일치하는 모든 값을 제거해 버리기 때문이다.
insert into TBL1 values ('1');
insert into TBL1 values ('1');
insert into TBL1 values ('2');
insert into TBL2 values ('1');
insert into TBL2 values ('3');

select * from TBL1
EXCEPT
select * from TBL2

>결과
2
  • TBL1에 복수 존재하는 "1"의 값은 모두 제거된 뒤의 결과가 된다.
 
MS SQL Server에서 동적으로 SQL을 짜고, 실행하고, 값을 돌려받을 수 있다.
이하의 소스가 그 예로, 동적SQL 속의 변수(@sDate1,@sDate2)에 할당된 값을 외부의  변수(@sOutput1,@sOutput2)에 할당하고 있다.
declare @sSQL      nvarchar(max);
declare @sParam    nvarchar(max);
declare @sOutput1  char(8);
declare @sOutput2  char(10);

set @sSQL = N'select @sDate1 = convert(char(8),getdate(),112)'
set @sSQL = @sSQL + N',@sDate2 = convert(char(10),getdate(),111)'

set @sParam = N'@sDate1 char(8) OUTPUT';
set @sParam = @sParam + N',@sDate2 char(10) OUTPUT';

execute sp_executesql @sSQL, @sParam
                    , @sDate1 = @sOutput1 OUTPUT
                    , @sDate2 = @sOutput2 OUTPUT

select @sOutput1, @sOutput2

→실행결과
20110210 2011/02/10


예에서는 1행의 값을 돌려주기에 문제없지만, 북수행의 결과를 돌려줄 경우엔 최종행의 값이 얻어지게 된다.
 오라클에서는 에러가 나지만, MS SQL Server에서는 에러는 일어나지 않는다.
 

[MSSQL] SQL Server 2008에서 MERGE문 사용

MS SQL | 2010. 12. 23. 15:49
Posted by Haronoid
* MS SQL Server 2008부터 서포트하게된 MERGE문의 사용방법
MERGE TBL1
USING TBL2
ON (TBL1.CLM1 = TBL2.CLM1)
WHEN MATCHED THEN
UPDATE SET TBL1.CLM2 = TBL2.CLM2
WHEN NOT MATCHED THEN
INSERT (TBL1.CLM1, TBL1.CLM2) Values (TBL2.CLM1, TBL2.CLM2);
c
  • TBL1의CLM1에TBL2의CLM1가 있을 경우 CLM2을 갱신
  • TBL1의CLM1에TBL2의CLM1가 없을 경우 TBL1에 새레코드를 등록

**비교대상이 테이블이 아닌경우의 사용예
일반적으로는 이 예의 경우가 자주 쓰기게 될 것같다.
MERGE TBL1
USING (SELECT 'A' CLM1, 'B' CLM2) TBL2
ON (TBL1.CLM1 = TBL2.CLM1)
WHEN MATCHED THEN
UPDATE SET TBL1.CLM2 = TBL2.CLM2
WHEN NOT MATCHED THEN
INSERT (TBL1.CLM1, TBL1.CLM2) Values (TBL2.CLM1, TBL2.CLM2);
  • TBL1의CLM1에'A'가 있을 경우 갱신
  • 없을 경우엔 새레코드로 등록한다.
 

[MSSQL] SQL Server의 RPAD구현

MS SQL | 2010. 12. 23. 15:32
Posted by Haronoid
* MS SQL Server에는 RPAD함수가 기본제공 되지 안기때문에 함수로서 정의해 줄 필요가 있다.
CREATE FUNCTION F_RPAD
(
	@TEXT VARCHAR(200),
	@MAX_COUNT INT,
	@PAD_CHAR CHAR(1)
)
RETURNS VARCHAR(200)
AS
BEGIN
	DECLARE @RTNVAL VARCHAR(200)
	SELECT @RTNVAL = RIGHT(REPLICATE(@PAD_CHAR, @MAX_COUNT) + @TEXT , @MAX_COUNT)
	RETURN @RTNVAL
END
  • FUNCTION의RETURNS형을 변수로 지정해주지 않고 리턴해버릴경우 0를 반환하게된다.
* 실행
SELECT dbo.F_RPAD('AA', 6, '0')

結果
0000AA
 
블로그 이미지

Haronoid

기본적으로 프로그래밍 관련 메모를 중점으로 합니다. 자세한 설명이 결여되어 있을 가능성이 있습니다.

카테고리

분류 전체보기 (29)
프로그래밍 기본 (1)
VB&VBA (1)
JAVA (0)
ORACLE (10)
WidnowsCommandLine (2)
Excel (1)
Windows (1)
.NET (6)
MS SQL (6)