2012-10-10 5 views
1

나는이 2 열이있는 테이블 :쉼표로 구분 된 열에서 비트 연산을 수행하는 방법은 무엇입니까?

ID (INT) (PK) NumList (VARCHAR) 
1    2,4,25 
2    2,12,25,33 
3    3,10 

이 어떻게의이 테이블에 열을 추가하고 또는 적용을 가정 해 봅시다 것 | 목록에있는 번호에 연산자를()?

ID NewCol 
1 31 
2 63 
3 11 
+0

NewCol (표시된)의 값은 NumList와 어떤 관련이 있습니까? – RichardTheKiwi

+0

@RichardTheKiwi, 비트 단위 또는 numlist의 값 3 | 10 = 11, 매우 화가났습니다. –

+0

다중 값을 분할하여 조작 할 수 있다면 이것을 살펴보십시오. http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-reco –

답변

1
create table tbl (
    ID int, 
    NumList VARCHAR(100)); 
insert tbl select 
    1, '2,4,25' union all select 
    2, '2,12,25,33' union all select 
    3, '3,10'; 

select t.ID, t.NumList, sum(distinct power(2,v.number)) newcol 
from tbl T 
outer apply (values (cast('<a>'+REPLACE(NumList,',','</a><a>')+'</a>' as xml))) X(xml) 
outer apply X.xml.nodes('/a') N(Num) 
left join master..spt_values v on v.type='P' and v.number between 0 and 30 
    and power(2,v.number) & N.Num.value('.','bigint') > 0 
group by t.ID, t.NumList 
order by t.ID 

=== results 
ID NumList  newcol 
---- ------------ ----------- 
1 2,4,25  31 
2 2,12,25,33 63 
3 3,10   11 
0

당신은 새 열을 추가, 당신은 아마 NumList가 변경 될 때마다 삽입 또는 업데이트에 새 열을 계산을하고 채우는 트리거를 작성해야 할 것입니다. 트리거는 NumList에서 숫자를 파싱해야하고 계산을 수행 한 다음 결과를 새 열에 넣어야합니다.

은 (당신을 보이더라도 이미 연산자를 사용하는 방법을 알고, 그냥 열을 채우는 방법을 궁금해?) T-SQL에서 비트 연산자에 대한 설명은 아래 링크를 참조

http://msdn.microsoft.com/en-us/library/ms176122.aspx

관련 문제