문제

간단한 쿼리를 가능하게 불가능하지만 내가 알고 있는 몇몇 똑똑한 사람들이있다:)

주 boolean 변수,나를 정의한 내 where 절을 제한 하거나 특정 열 출력-또는 아무것도 할 수 없습니다.

주어진,그래서 매개 변수@bit=1 이 결과는:

는 열=1

지정된 매개 변수@bit=0 이 결과는:

는 열=1 또는 0

즉아무 효과도 없/모든 결과(열의 비트 필드)

나는 원하지 않는 dynamic sql-I 정착 할 수 있는 고정이 이 코드에서 하지만 난 그냥을 궁금해 있는 경우에는 몇몇 똑똑한 마술는 위의 깔끔하고 간단합니다.

입니까?나는 sql 을 사용하여 서버입니다.

환호:D

도움이 되었습니까?

해결책

대답 column = 1 or @bit = 0 열이 0 또는 1 일 수있는 경우 작동하는 경우 열이 원하는 값인 경우 : column = 1 or @bit = 0 and column = 0.

다른 팁

SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

색인이있는 경우 column1, 이것은 더 효율적일 것입니다 :

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

단일의 성능 비교를 위해 내 블로그 에서이 기사를 참조하십시오. WHERE 조건 대 UNION ALL:

where column BETWEEN @bit AND 1
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)

나는 다른 대답하고 느꼈 벙어리를 볼 때에 합의 대답이다.그래서 단지를 위한 약혼자에게 차이자,두 비교하여 내 자신의 데이터베이스입니다.지는 않지만 알고 있는 경우 그들은 정말로 비슷하지만,내가 실행 계획은 약간의 장점을 나의 구피 답변:

선택*
됩니다.
는 곳에 열 <>경우@면 1 다음 0 다른 -1end

나는 깨닫는 인덱스,테이블 크기,등등.에 영향을 미칠 수 있다.
또한,당신은 아마 당신을 실현할 수 없을 비교하 -1...
았다고 생각을 공유합니다.

이 시도

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

이것은 열의 데이터 유형이 무엇이든 관계없이 작동합니다 (예 : 문자열 일 수도 있습니다). 물론 그것이 다른 기본값이 될 것입니다 (0이 아님)

여기서 열> = @bit

그러나 이것은 숫자 열에서> 0 값에 대해서만 작동합니다. @bit은 데이터 유형 우선 순위로 인해 int, smallint 등에 암시 적으로 캐스트됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top