Home | Print | Q/A | Guest | NewsLetter
Display context of search results Case-sensitive searching
Database System
Data Warehouse
Data Analysis
Operating System
Open Source
Enterprise Architecture
Software Engineering
Process
Working Smart

SQL Server
PostgreSQL
Oracle
DB2
Teradata
MySQL
Performance Tuning
Programming

Link
Philosophy
Tools
Misc
주인놈
_
_
SideBar Edit

Contents



재귀쿼리를 이용해서 2진수의 변환을 해보자. 87이란 정수가 있다. 이를 2진수로 변환하기 위해서는 다음과 같은 계산을 해야 한다.

87/2 = 43, 나머지 = 1
43/2 = 21, 나머지 = 1
21/2 = 10, 나머지 = 1
10/2 = 5, 나머지 = 0
5/2 = 2, 나머지 = 1
2/2 = 1 나머지 = 0

결과는 1010111 = 26 + 24 + 22 + 21 + 20 = 64 + 16 + 4 + 2 + 1 = 87 이 되어야 한다. 요걸 한방에 어떻게 해결할 수 없을까? 제목에서 나타나 있듯이 재귀쿼리를 이용하면 된다. 다음의 소스를 실행하면 원하는 결과를 얻을 것이다.

declare 
	@int int
,	@bin varchar(100);

set @int = 87;
set @bin = '';
with dumy(no, mod, bin)
as
(
	select 1, @int, convert(varchar, @int%2)
	union all
	select no + 1, @int/power(2, no), convert(varchar, (@int/power(2, no))%2)
	from dumy
	where no + 1 <=30
)
select 
	@bin = @bin + bin
from dumy
where mod + bin > 0
order by no desc

select @bin bin

/* result

bin
----------------------------------------------------------------------------------------------------
1010111

*/

한 가지 고려해야 할 점은 2진수를 표현할 수 있는 데이터형이 없다는 것이다. 그래서 2진수를 표현하려면 문자열로 표현을 해야 한다. int형을 표현하기 위해서는 31자리의 문자가 필요하다. 트래이드 오프이긴 하지만.. 위의 스크립트를 함수로 만들거나 10진수와 2진수의 매칭 테이블을 만들어서 관리하는 방법도 있겠다. 참고로 매칭 테이블은 다음과 같이 만들면 된다.

select colbin
into #bin
from (select '0' colbin union all select '1') t

select (b1.colbin + b2.colbin + b3.colbin) as bin_number
from #bin b1 cross join #bin b2 cross join #bin b3
order by 1;

/* result
bin_number
----------
000
001
010
011
100
101
110
111
*/

EditText|Print|FindPage|DeletePage|LikePages|http://www.databaser.net|last modified 2010-03-08 17:36:50