2012-11-03 3 views
2

이것은 나쁜 생각 일지 모르지만 궁금해할까요?sql cte if 문

;with Products 
AS 
(
/* can you have an if statement in here? */ 
select * from products 

/* or */ 

select * from products 
where condition 

) 

가끔은 검색 문자열이있는 경우 어떻게 생각합니까? 당신은 그것을 cte에 어떻게 고려합니까?

어쩌면 하나의 절차에서 2 cte를 갖는 것이 더 좋은 생각일까요?

+0

이 갖는 제품 선택 * @tbl CTE와 관련이 있습니다. – Lucero

답변

5

검색 문자열을 매개 변수로 전달하는 경우 검색 문자열을 하나의 명령문에서 모두 또는 모두가 아닌지 확인할 수 있습니다. 예 :

select * 
from MyTable 
where MyColumn = @SearchString 
    or @SearchString is null; 

매개 변수가 null이 아닌 경우 일치하는 레코드를 반환하고, null 일 때 모든 레코드를 반환합니다.

다른 옵션으로 언제든지 case 문을 where 절에 넣을 수 있습니다.

그 외에도 다른 쿼리가 필요하다면 if으로 확실하게 분기 할 수 있지만 CTE를 선언 한 후 바로 다음 쿼리 여야합니다. 따라서 if 문의 각 분기에서 사본이나 CTE 및 쿼리를 가져야합니다.

전체 where 절을 전달하고이를 동적 SQL (편집 : ORM 유형 sp_executesql이 아닌 매개 변수화되지 않은 연결 문자열을 의미)으로 실행하려는 경우 위의 항목 중 하나를 사용하도록 리팩터링을 시도합니다 방법은 먼저 inherent problems with dynamic SQL입니다. 동적 인 SQL은 처음부터 영리하고 우아 해 보입니다.하지만 다른 옵션이 어떻게 든 더 나 빠지면 마지막 수단으로 여겨 져야합니다.

+0

실제로 필터 조건이 있거나 없을 수도있는 '모두 포착'유형 대기열에 대해 동적 SQL은 훌륭한 구현입니다. 다른 방법 (WHERE ([foo] = [at] bar 또는 [at] bar IS NULL) AND ..)은 첫 번째 실행을 위해 캐시 된 쿼리 계획이 완전히 잘못되었을 수 있으므로 성능이 저하 될 수 있습니다. 둘째. 이 경우 동적 SQL을 사용하고 sp_executeSql을 사용하면 검색의 각 순열이 자체 재사용 계획을 얻게됩니다 (http://sqlinthewild.co.za/index.php/2009/). 03/19/catch-all-queries/ –

+0

좋은 물건. 저것에있는 연결 한 기사는 더군다나 상세한 것을 얻고 2008 년 동안 약간 고려 사항에 점. 당신이 응답을 만드는 경우에, 나는 upvote. –

1

변수 표가 도움이 될 수 있습니다. 도움이된다면 (... 아이디 INT, 이름 varchar (500)) ..

DECLARE의 @tbl 표를 확인

경우 < @booleanexpression = 1> INSERT INTO 제품 SELECT * FROM @tbl 조건 .. CTE와

로 (@tbl * FROM) 다른 어디 INSERT INTO은 CTE에서 선택

*가