IN 절에서 CASE 문을 사용할 수 있습니까?IN 절에서 CASE 문 사용
이 내가 제대로 컴파일려고 한 무엇의 단순화 된 버전입니다 :
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END)
감사합니다!
IN 절에서 CASE 문을 사용할 수 있습니까?IN 절에서 CASE 문 사용
이 내가 제대로 컴파일려고 한 무엇의 단순화 된 버전입니다 :
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END)
감사합니다!
CASE
은 스칼라 값만 반환합니다. 대신이 작업을 수행 할 수 있습니다. (나는 당신의 예에 따라, @StatusID = 99, 99의 StatusID 값이 일치하지 않을 때 것을, 가정입니다.)
select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
or (@StatusID <> 99 and StatusID = @StatusID)
번호 대신
SELECT *
FROM MyTable
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1
WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1
ELSE 0
END)
외부를 넣을 수 있습니다
case 문없이이 코드를 작성할 수도 있습니다.
또 다른 옵션은 실제로 SQL 문으로 문자열을 만든 다음 실행하는 동적 SQL입니다. 그러나이 경우 동적 SQL은 과도한 것처럼 보입니다.
다른 사람의 배치 구문을 읽은 후이 구문에 대해 궁금해했는데 이제는 그 구문이 사용 된 이유를 알았습니다. 좋은 팁, 고맙습니다, @ gordon-linoff – Sung
나는 이것을 다음과 같은 상황에서 TVC가 허용되지 않는 테이블 밸류 생성자를 사용하여 다르게 시도 할 것이라고 생각했다.
SELECT *
FROM MyTable
WHERE StatusID IN
(
SELECT
CASE
WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID)
ELSE @StatusID
END
)
TVC를 사용하여이를 수행 할 수 있지만 접근 방식은 조금 다릅니다. 이 케이스를 사용하지 않지만, 가능한 옵션의 수를 선택할 수있다 곳은 더 잘 확장 할 수에서 :
SELECT *
FROM MyTable
join (values
(99,5),(99,11),(99,13),
(@StatusID , @StatusID)
) t(k,v) on t.k= @StatusID and t.v = StatusID)
또는 다음 WHERE 절에 모든 것을해야하는 경우 :
SELECT *
FROM MyTable
WHERE exists (
select 1
from (values
(99,5),(99,11),(99,13),
(@StatusID , @StatusID)
) t(k,v)
where t.k= @StatusID and t.v = StatusID)
를 @ LittleBobbyTables 당신의 이름으로, 나는 당신이 백엔드에서 그것을 바꿀 수 있다고 확신합니다. – RedFilter
고마워요! 훌륭한 솔루션! – crjunk