2013-11-01 3 views
1

조건에 따라 CTE에서 select를 수행하려고합니다.조건에 따른 TSQL SELECT

오늘의 기간에 대해 선언 한 변수가 있습니다 (@PRD). 현재 보유하고있는 기간의 가치를 보유합니다.

이제 나는 상반기에 있는지 여부에 따라 반환되는 정보를 제한하는 표를 선택하고 싶습니다.

예를 들어, 우리는 기간 2이므로 PRD 1과 5 사이의 모든 CTE에서 반환 된 모든 항목을 원합니다. 기간 6 (5 이후) 인 경우, 표.

SELECT 
    CASE 
     WHEN @PRD <= 5 
     THEN (SELECT * FROM DISPLAY WHERE PERIOD IN (1,2,3,4,5)) 
     ELSE (SELECT * FROM DISPLAY) 
    END 

내가 오류 받고 있어요 :

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

하십시오 나는이 작업을 수행 할 수있는 방법에 대한 어떤 생각을

이것은 내가 달성하기 위해 노력하고있어의 의사인가?

감사 X

/편집 업데이트 : 코드의

더는 CTE를 포함 정말 깁니다. 내가 원하는

PERIOD (INT) DEPARTMENT GROUP BUDGET 
1    ENERGY  HE  500 
2    ENERGY  HE  780 
3    ENERGY  HE  1500 
4    ENERGY  HE  4500 
5    ENERGY  HE  400 
6    ENERGY  HE  3500 
7    ENERGY  HE  940 
8    ENERGY  HE  1200 

그것을 나에게 단지 상위 5 개 표시하려면 : 결론은 다음과 같다 데이터를 반환, 나는이 CTE

;WITH DISPLAY as (
    select * from lots_of_things 
) 
SELECT * FROM DISPLAY 

정기적이 CTE에 선택 할 데가 있다고 할 수있다 현재 기간이 1,2,3,4,5이면 행입니다. 그러나 우리가 6,7,8,9와 같은 다른 기간에있는 경우 모든 테이블 행을 표시합니다. 현재 기간은 오늘 날짜와 테이블에 보유 된 범위를 비교하여 파생 된 변수 @PRD에 보관됩니다. 값은 정확하고도이이 해결책이 될 수

SQL FIDDLE

+1

'사례'는 * 단일 값 (행당)을 반환하는 * 표현식 *입니다. 표시하고있는 오류 메시지를 생성하는 현재 코드를 더 표시 할 수 없습니까? –

+0

몇 개의 "마침표"가 있으며 그 해의 연도와 어떻게 관련이 있습니까? 당신의 논리는 이상하게 보입니다. "우리는 2 기가되었으므로 PRD 1과 5 사이의 CTE에서 반환 된 모든 것을 원합니다!" 그러나 그것이 당신이 필요로하는 것이라면 나는 생각합니다 ... – Tony

+0

안녕 Damien. 그것이 오류를 생성하는 코드였습니다. 그것은 꼬리 끝에 cte ...이었다 이것을 보여주기 위해 갱신 할 것이다 –

답변

5

이 작동합니다 :

SELECT * FROM DISPLAY WHERE (@PRD > 5 OR PERIOD IN (1, 2, 3, 4, 5)) 

을이 코드가 당신을 혼동하는 경우, 어떤 일어나는 것은 @PRD> (5) 및 그 true를 돌려주는 경우, 우리의 표현이 항상 true입니다 그래서 우리는 모든 반환하면 우리가 확인하는 것이있다 행. 변수가 5보다 작거나 같으면 (예를 들어 본 것처럼) 첫 번째 검사는 거짓이며 마침표가 목록인지 확인합니다.

+0

나는 당신이 무엇을 의미하는지 이해하지 못한다 –

+1

@Chen 그냥 선택을 추가 ... 대답을 업데이 트합니다. –

+0

Duh! 그것들을 수 시간 동안 바라 보았고 가장 명백한 해결책들에 대해서 ... ... 감사합니다. –

1

도움 INT

희망을 입력

IF @PRD <= 5 
    SELECT * FROM DISPLAY WHERE PERIOD IN (1,2,3,4,5) 
ELSE 
    SELECT * FROM DISPLAY 

UPD

사용한다이 경우 변수가 CTE 대신 가능합니다.

DECLARE @PRD INT; 
SELECT @PRD = PERIOD FROM SOME_TABLE WHERE ... 
+0

키워드 'IF'근처에 구문이 잘못되었습니다. 나는 SQL 2008 BTW에있다. 또한 이것은 CTE (베어링이있는 경우)를 따릅니다. –

+0

@Chen, http://sqlfiddle.com/#!3/7f824/1 - 작동해야합니다. 더 자세한 정보를 제공 할 수 있습니까? 'IF'이전의 줄은 무엇 이었습니까? – Smileek

+0

안녕하세요. Smileek. 나는 출력을 보지 못한다 : S는 올바른 sqlfiddle 링크인가? –