2017-12-01 4 views
0

내 테이블에는 여러 개의 docNum 시리즈가 있습니다.매개 변수를 사용하여 레코드를 검색하는 방법은 무엇입니까?

모든 시리즈를 조건부로 검색하거나 세트에서 하나의 시리즈를 제외하고 싶습니다.

나는 오류

declare @p char(1) = 1 

select 
    t0.docNum 
from 
    OINV t0 
where 
    t0.DocNum = case 
        when @p <> '1' then t0.DocNum        
        else (select t1.DocNum 
         from oinv t1 
         where SUBSTRING(convert(varchar, t1.docNum), 1, 1) <> '9' 
          and LEN(convert(varchar, t1.docNum)) < 7) 
       end 

을 반환 다음 쿼리를 시도 무엇 올바른 쿼리를해야 하는가?를

+1

무엇이 오류입니까? – zambonee

+1

여기에 몇 가지 문제가 있습니다. 먼저 문자열 리터럴을 '1'로 정의해야합니다. 그런 다음 varchar로 변환하지만 길이는 지정하지 않습니다. 길이에 대한 기본값이 있으며 용도에 따라 변경됩니다. 노골적으로 말하십시오. 그리고 이것은 조금 복잡해 보이지만 실제로 진행되는 것을 말하기는 어렵습니다. 오류가 있다는 것을 말하는 대신 오류 메시지를 게시 한 경우 도움이 될 것입니다. –

+0

방금 ​​SQL을 배우기 시작할 때, 실수로 많은 쿼리를 작성하는 대신 모든 문에 대해 쿼리를 실행하는 것이 좋습니다. 첫 번째 줄에서 실패 할 것입니다. – Eric

답변

1

1 행 이상을 반환하는 하위 쿼리에 대한 오류 메시지가 표시됩니다. 하위 쿼리가 테이블의 모든 행을 반환하기 때문입니다. 이를 피하기 위해 하위 쿼리를 외부 쿼리와 상관시켜야합니다. 하지만 여기서 하위 쿼리를 사용할 필요는 없습니다. 이것은 이렇게 단순화 될 수 있습니다.

declare @p char(1) = '1' 

select o.docNum 
from OINV o 
where @p <> '1' 
OR 
(
    SUBSTRING(convert(varchar(10/*whatever size is appropriate*/), o.docNum), 1, 1) <> '9' 
    and 
    LEN(convert(varchar(10/*whatever size is appropriate*/), o.docNum) ) < 7 
) 
관련 문제