[SQL] IN 절 안에 CASE 문을 사용하여
SQLIN 절 안에 CASE 문을 사용하여
IS는 IN 절 안에 CASE 문을 사용할 수 있습니까?
이것은 내가 제대로 컴파일려고 한 무엇의 단순화 된 버전입니다 :
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )
감사!
해결법
-
==============================
1.CASE는 스칼라 값을 반환합니다. 대신이 작업을 수행 할 수 있습니다. (나는 가정입니다 귀하의 예에 따라, @StatusID = 99, 99의 StatusID 값이 일치하지 않을 때 그.)
CASE는 스칼라 값을 반환합니다. 대신이 작업을 수행 할 수 있습니다. (나는 가정입니다 귀하의 예에 따라, @StatusID = 99, 99의 StatusID 값이 일치하지 않을 때 그.)
select * from MyTable where (@StatusID = 99 and StatusID in (5, 11, 13)) or (@StatusID <> 99 and StatusID = @StatusID)
-
==============================
2.대신 번호, 당신은 외부를 넣을 수 있습니다
대신 번호, 당신은 외부를 넣을 수 있습니다
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이 경우 과잉처럼 보인다.
-
==============================
3.나는 테이블 값 생성자를 사용하여 다른이를 시도 할 거라고 생각 - TVC를 다음과 같은 상황에서 허용되지 않습니다?
나는 테이블 값 생성자를 사용하여 다른이를 시도 할 거라고 생각 - TVC를 다음과 같은 상황에서 허용되지 않습니다?
SELECT * FROM MyTable WHERE StatusID IN ( SELECT CASE WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID ) ELSE @StatusID END )
-
==============================
4.당신의 TVC를 사용하여이 작업을 수행 할 수 있지만 접근 방식은 조금 다르다. 이 케이스를 사용하지 않지만, 선택 가능한 옵션의 숫자가있는 곳은 더 잘 확장 할 수 :
당신의 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)
from https://stackoverflow.com/questions/11232267/using-case-statement-inside-in-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 읽기 / MySQL의에서 쓰기 유니 코드 데이터를 (0) | 2020.06.16 |
---|---|
[SQL] NULL은 Postgres를 배열에 존재하는지 확인 (0) | 2020.06.16 |
[SQL] 왜 RAND ()는 난수를 생성되지 않는 이유는 무엇입니까? (0) | 2020.06.16 |
[SQL] SQL Server의 합계 시간 [중복] (0) | 2020.06.16 |
[SQL] SELECT DATEPART 의해 행 () (0) | 2020.06.15 |