#title 2진수 변환과 재귀쿼리 [[TableOfContents]] 재귀쿼리를 이용해서 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 = 2^6^ + 2^4^ + 2^2^ + 2^1^ + 2^0^ = 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 */ }}}