문제

여기서 절단 내부의 사례 표현식을 사용하는 것에 대해 읽었습니다.

http://scottelkin.com/sql/using-a-case-statement-in-a-sql-wherwhere-clause/

이를 사용하여 사용자의 응용 프로그램에 의해 전달되는 계약 번호를 기반으로 SELECT 문에서 결과를 필터링하려고합니다. 내 코드는 현재 전달 된 내용에 관계없이 '유효하지 않은 매개 변수'오류가 발생합니다. Select/From이 사례 표현식이없는 상태로 잘 작동하는지 확인했습니다. 여기 내 코드가 있습니다.

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END =
tblContracts.ContractNo)

코드의 중복성은 문제 해결 목적으로 사용되며 나중에 케이스에서 와일드 카드 필터링을 사용할 계획입니다. 나는 지금 구문을 내려 놓는 데 집중하고 있습니다. 매개 변수가 표에 저장된 계약 번호와 일치하는 모든 레코드를 반환해야한다고 생각합니다. 모든 도움이나 조언은 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

설명을 읽은 후에는이 작업을 수행하는 더 좋은 방법이 있습니다. CASE:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo

그렇지 않으면 일치하는 계약 번호 만 반환합니다 @ContractNo 0이고,이 경우 모든 레코드를 반환합니다.

편집하다: 방금 알아 차렸다 Casperone도 같은 것을 제안했습니다. 나는 그것을 보지 못했다. 크게 스스로.

다른 팁

이 작업을 하시겠습니까? 귀하의 사례 진술은 항상 반환됩니다 @ContractNo. 나는 당신이 찾고있는 것이 이것이라고 생각합니다.

where 
    case @ContractNo 
        when 0 then tblContracts.ContractNo 
        else @ContractNo 
    end = tblContracts.ContractNo

위의 필터는 "나에게 계약을 줘 ContractNo 매개 변수가 0 인 경우 매개 변수와 같습니다.

이전 필터는 계약 번호 필드가 매개 변수와 정확히 동일한 경우에만 필터링되었습니다.

그럼에도 불구하고 대신이 작업을 수행해야합니다.

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo

논리는 이해하기가 훨씬 쉽고, 그 위에 (이것에 대해 인용하지 마십시오), Optimizer는 아마도 사례 진술 외부에서 더 잘 작동 할 것입니다.

어쨌든 잘못된 장소에있는 괄호를 벗어나십시오. 올바른 것은 "끝"이어야합니다.

@contractno를 선언하는 것을 잊었을까요? 0과 tblcontracts.contractno와 비슷합니까?

Recursive의 게시물은 내 문제를 정확하게 해결했습니다.

나는 원래 게시물의 명확성에 대한 불만을 보았다. 앞으로, 내가 말하는 것을 더 직접적으로 만들기 위해 무엇을 할 수 있습니까? 나는 코드에 대한 질문을 표현하는 데 익숙하지 않으며, 혼란스러운 것들에 대해 사과합니다. 두 번째 게시물에서와 같이 확장 된 세부 정보를 제공해야 했습니까?

모든 도움에 다시 한번 감사드립니다.

가까운 괄호 이동 이전에 = like :

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo

나는이 사건 진술이 무엇을할지 알지 못합니다 ... @contractno = 0이거나 그렇지 않은 경우 같은 일을 반환하고 있습니다 ...

올바른 구문은 다음과 같습니다.

  Select...
  ...
  Where(
    Case
      When <Condition>
        Then <Return if true>
        Else <Return if false>
      End
 ) = <Whatever is being matched to the output of the case statement>

구문에 관계없이, 예제는 의미가 없습니다. 일치하거나 계약 번호가 0 인 경우 모든 항목을 찾고 있다면 다음을 수행합니다.

Select...
...
Where (
  @ContractNo = 0 Or
  @ContractNo = tblContracts.ContractNo
)

사례 진술을 사용하려는 것보다 훨씬 더 의미가있는 것 같습니다.

편집하다: 질문을 약간 잘못 읽어야합니다. 누락 된 매개 변수는 일반적으로 쿼리/프로 시저의 범위에 매개 변수 (이 경우 @contractno)가 선언되지 않았 음을 의미합니다. 그러나 누군가가 이미 그것을 지적 했으므로 그에 대한 신용을 얻을 수 없습니다.

"0이라면 0 인 경우 매개 변수를 제공하고 그렇지 않으면 매개 변수를 제공하기 만하면"사례 명령문의 이유는 구문을 올바르게 얻으려고 테스트하는 것이 었습니다. 원래, 나는 "0이라면, '%'를 통과하여 모든 값을 반환하기 위해 '%'라고 말하려고 시도했습니다. 내가 게시 한 코드는 계속해서 '유효하지 않은 매개 변수'를 얻었고 내 구문에 뭔가 문제가 있다고 생각했기 때문입니다. 나는 그것을 그렇게 일치시키는 기본 매개 변수로 분리했습니다.

WHERE @ContractNo = tblContracts.ContractNo

레코드를 잘 반환했습니다. 좀 더 설명하겠습니다.

나는 다양한 테이블에서 뽑아 내고 Select 문에 포함되지 않은 정보로 내용을 필터링하고 있습니다 (예 : tblContracts는 Select에서 정보를 가져 오지 않으며 어디에서만 사용됩니다). 사용자는 다른 계약 번호와 'all'의 기본값을 갖는 콤보 상자 중에서 선택합니다.

콤보 상자의 색인이 변경 될 때 이벤트가있을 것입니다. 그것이 'All'인 경우 0은 매개 변수로 전달되며 필터링을 수행하지 않기를 원합니다. 그렇지 않으면 해당 계약 번호 (다른 @ContractNo의 이유)에 대한 정보 만 원합니다.

이렇게 의미하지 않습니까?

SELECT * 
    FROM tblContracts
    WHERE     
    CASE 
       WHEN tblContracts.ContractNo = 0 THEN @ContractNo 
       ELSE tblContracts.ContractNo
    END = tblContracts.ContractNo

여기서 @contractno는 tblcontracts.contractno와 동일한 데이터 유형의 가변적입니다.

왜 사례 진술이 필요합니까?

@contractno = 0이면 (0 = tblcontracts.contractno) else @contractno (@contractno = tblcontracts.contractno)

이것은 단순히 이것을 다음과 같이 쓸 수 있기 때문에 의미가 없습니다.

여기서 @contractno = tblcontracts.contractno

계약 번호는 실제로 숫자이거나 항상 숫자 인 문자열입니까? 테이블과 매개 변수 사이의 데이터 유형 및 CASE 문 (예 : "= 0"또는 "= '0" ")을 확인하십시오.

이 구문은 작동해야합니다 (Oracle에서 수행)

WHERE CASE WHEN tblContracts.ContractNo = 0 
           THEN @ContractNo 
           ELSE tblContracts.ContractNo
      END = tblContracts.ContractNo

당신이 말할 때:

나는 다양한 테이블에서 뽑아 내고 Select 문에 포함되지 않은 정보로 내용을 필터링하고 있습니다 (예 : tblContracts는 Select에서 정보를 가져 오지 않으며 어디에서만 사용됩니다). 사용자는 다른 계약 번호와 'all'의 기본값을 갖는 콤보 상자 중에서 선택합니다.

그런 다음 "존재하는 곳"조항이 있어야합니다. 그 테이블에서 정보를 가져 오지 않기 때문에?!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top