BIT 필드에 MIN 집계 함수 적용


82

다음 쿼리를 작성하고 싶습니다.

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

문제는 SQL Server가 비트 필드의 최소값을 계산할 때 오류를 반환하는 것을 좋아하지 않는다는 것Operand data type bit is invalid for min operator 입니다.

다음 해결 방법을 사용할 수 있습니다.

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

그러나 더 우아한 것이 있습니까? (예를 들어, 내가 모르는, and필드의 비트 값 의 논리를 평가하는 집계 함수가있을 수 있습니다 .)


2
@Adam Robinson : 분명히,Operand data type bit is invalid for min operator.
Andomar 2011-08-09

4
더 우아한 것에 대해서는 모르지만 조금 더 짧습니다. cast(min(SomeBitField+0) as bit)
Mikael Eriksson

5
@Andomar : 당연히 이미 문제를 알고 있다면, 그렇습니다.하지만 비슷한 문제를 가진 다른 사람들이 오류 메시지를 검색 할 수 있으므로 이와 같은 정보가 문제에 포함되어야합니다.
Adam Robinson

답변:


33

에는 두 가지 옵션 BIT만 있으므로 case 문을 사용하십시오.

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

다음과 같은 이점이 있습니다.

  • 테이블 스캔을 강요하지 않음 ( BIT필드의 인덱스는 거의 사용되지 않음)
  • 단락 TWICE (에 대해 한 번 EXISTS반복 CASE)

작성하는 코드가 조금 더 많지만 끔찍하지는 않습니다. 확인할 값이 여러 개인 경우 쿼리 시작 부분에 더 큰 결과 집합 ( JOINFILTER기준 포함)을 항상 캡슐화 CTE한 다음 CASE문 에서 참조 할 수 있습니다.


10
bitnull 허용 여부에 대한 세 가지 옵션이 있습니다 .
Martin Smith

1
bit열이 전체 NULL값으로 구성된 경우 MIN를 반환해야합니다 NULL.
Martin Smith

8
저는 "저급"프로그래머 여야하지만 select 1 from ...하위 쿼리 의 전체 예제를보고 싶었습니다 . 말이되지 않습니다.
Vaccano

2
@Vaccano -SELECT 1 FROM Outertable WHERE bitfield=1
JNK

2
원래 질문에는 GROUP BY가 포함되었습니다. WHERE에 기준별로 그룹을 포함해야합니다.
Tmdean 2015-06-04

156

한 가지 옵션은 MIN(SomeBitField+0)입니다. 소음이 적고 잘 읽혀집니다 (우아함으로 인정됩니다).

즉, CASE옵션 보다 해킹에 가깝습니다 . 그리고 나는 속도 / 효율성에 대해 아무것도 모릅니다.


@Ben, 고마워요. 이것은 또한 내 SQL 쿼리에 도움이됩니다.
PatsonLeaner

@Ben, 당신은 +0의 문서를 가지고 있습니까?, 그것을 찾으려고했지만 참조를 위해 아무것도 찾지 못했습니다 :)
Francisco Sevilla

1
@FranciscoSevilla 암시 적 우선 순위 변환 때문이라고 생각합니다. docs.microsoft.com/en-us/sql/t-sql/data-types/…
Ben Mosher

7

이 쿼리가 최상의 솔루션입니다.

SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn
 FROM MyTable

BitField + 0을 추가하면 자동으로 int처럼됩니다.


7
select min(convert(int, somebitfield))

또는 결과를 비트로 유지하려면

select convert(bit, min(convert(int, somebitfield)))

6

다음을 시도해보십시오 : 최소 표현 및 집계 함수, 최대 표현 또는 집계 함수

SELECT   ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)...
FROM     ...
WHERE    ...
GROUP BY ...

같은 결과


5

이 작은 코드는 항상 저와 함께 매력적으로 작용했습니다.

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField

2

AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE

퍼지 부울을 지정하십시오.

  • 1은 모두 참임을 나타냅니다.

  • 0은 모두 거짓임을 나타냅니다.

  • ] 0..1 [사이의 값은 부분 일치를 나타내며 일정 비율의 진실 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.