2016-09-28 11 views
0

저는 SQL에 정통하지 않습니다. "Vendor Name"과 "Vendor Number"를 보고서에 포함시키려는 다음 사례를 사용하려고합니다.중첩 된 사례 오류 LEFT 또는 SUBSTRING 함수에 잘못된 길이 매개 변수가 전달되었습니다.

공급 업체 수

CASE WHEN [GLPOST].[SRCELEDGER] = 'AP' 
THEN 
(SELECT LEFT([GLJED].[TRANSREF], 
     CHARINDEX('-',[GLJED].[TRANSREF])-1) 
FROM [GLJED] WHERE [GLJED].[TRANSNBR] = '0000000020' 
    AND [GLPOST].[BATCHNBR] = [GLJED].[BATCHNBR] 
    AND [GLPOST].[ENTRYNBR] = [GLJED].[JOURNALID] 
) 
ELSE '' END 

공급 업체 이름

CASE WHEN [GLPOST].[SRCELEDGER] = 'AP' 
THEN 
(SELECT [APVEN].[VENDNAME] 
FROM [APVEN] 
WHERE [APVEN].[VENDORID] = (SELECT LEFT([GLJED].[TRANSREF], 
            CHARINDEX('-',[GLJED].[TRANSREF])-1) 
          FROM [GLJED] 
          WHERE [GLJED].[TRANSNBR] = '0000000020' 
          AND [GLPOST].[BATCHNBR] = [GLJED].[BATCHNBR] 
          AND [GLPOST].[ENTRYNBR] = [GLJED].[JOURNALID]) 
) 
ELSE '' END 
문제가

, 내가지고있어 오류

"왼쪽 또는 SUBSTRING 함수에 전달 된 매개 변수 길이가 잘못되었습니다."

[GLJED]. [TRANSREF]에 "-"트랜잭션이 없기 때문입니다.

나는이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 잘못하고 있습니다. "-1"을 제거하면 쿼리가 실행되지만 찾고있는 데이터가 제공되지 않습니다. 공급 업체 이름과 번호를 찾으려면 "-"왼쪽의 데이터가 필요합니다.

CHARINDEX ('-', [GLJED]. [TRANSREF]) = 0 인 경우 select 문 안에 다른 사례를 넣으려고했으나 잘못된 위치에 넣어야합니다.

친절하게, 나는 찾고 있었다!

+0

아마 때문에 CHARINDEX ('-'[GLJED].[TRANSREF]) - [GLJED]. [TRANSREF]에 -가 없으면 1은 -1입니다. – Matt

+0

맞아요, 실종 되었기 때문에 "-"오류를 일으키는 "0 - 1"이라고 기본적으로 말합니다. 나는 아직 그것을 고칠 수있는 방법을 찾지 못했다. – user1486004

답변

0

CHARINDEX('-',[GLJED].[TRANSREF])-1[GLJED].[TRANSREF]에 - (하이픈)이없는 경우 -1입니다.

그래서 당신은 몇 가지 방법으로 문제를 해결할 수 있습니다, 하나는 경우를 추가하여 귀하의 중첩 된 선택 : 당신이 경우 문에서 선택 중첩 된 Becuase

CASE WHEN CHARINDEX('-',[GLJED].[TRANSREF]) = 0 THEN [GLJED].[TRANSREF] 
ELSE LEFT([GLJED].[TRANSREF],CHARINDEX('-',[GLJED].[TRANSREF])-1) END 

아마 몇 가지 작업을 사용할 수있는 쿼리를 가정 할 것이다 그러나 다만 나는 그것이 될 것입니다 볼 수있는 수정할 수있는 복용 :

CASE WHEN [GLPOST].[SRCELEDGER] = 'AP' 
THEN 
(SELECT 
    CASE WHEN CHARINDEX('-',[GLJED].[TRANSREF]) = 0 THEN [GLJED].[TRANSREF] 
     ELSE LEFT([GLJED].[TRANSREF],CHARINDEX('-',[GLJED].[TRANSREF])-1) END 

     FROM [GLJED] WHERE [GLJED].[TRANSNBR] = '0000000020' AND [GLPOST].[BATCHNBR] = [GLJED].[BATCHNBR] AND [GLPOST].[ENTRYNBR] = [GLJED].[JOURNALID]) 
ELSE '' END 
+0

위대한 작품, 정말 너희들이 대단해서 고마워! – user1486004

0

CHARINDEX가 0을 반환하기 때문에 "-"가 누락되면 길이가 잘못 표시됩니다. 더하기 - 1은 LEFT 함수의 길이를 무효로 만듭니다.

substring 및 IndexOf를 사용하면이 문제가 발생하지 않습니다. 그러나 "-"문자가없는 경우 "빈 문자열"을 반환합니다. "-"이 경우를 처리 할 수없는, 당신은 "언제 CASE"를 사용할 수 있습니다

당신이 경우 전체 값을 반환하려면

CASE WHEN [GLPOST].[SRCELEDGER] = 'AP' 
THEN 
(SELECT SELECT SUBSTRING([GLJED].[TRANSREF], 0, CHARINDEX('-', [GLJED].[TRANSREF])) FROM [GLJED] WHERE [GLJED].[TRANSNBR] = '0000000020' AND [GLPOST].[BATCHNBR] = [GLJED].[BATCHNBR] AND [GLPOST].[ENTRYNBR] = [GLJED].[JOURNALID]) 
ELSE '' END 

--Return "Value1" for "Value1-Value2-Value3" 
--Return "" for "LonelyValue" 

편집 할 수 있습니다.

CASE WHEN [GLPOST].[SRCELEDGER] = 'AP' 
THEN 
(SELECT (CASE WHEN CHARINDEX('-', [GLJED].[TRANSREF]) <= 0 THEN 
      [GLJED].[TRANSREF] 
     ELSE 
      SUBSTRING([GLJED].[TRANSREF], 0, CHARINDEX('-', [GLJED].[TRANSREF])) 
     END) 
FROM [GLJED] WHERE [GLJED].[TRANSNBR] = '0000000020' AND [GLPOST].[BATCHNBR] = [GLJED].[BATCHNBR] AND [GLPOST].[ENTRYNBR] = [GLJED].[JOURNALID]) 
ELSE '' END 

--Return "Value1" for "Value1-Value2-Value3" 
--Return "LonelyValue" for "LonelyValue" 

또는이 특정 사건을 처리 할 때 "사건"을 피하기 위해, 다음과 같은 트릭을 사용할 수 있습니다. 당신의 값이 시작하거나 계산하지 않습니다 Len 때문에 공간 (들)로 끝나는 경우

SELECT SUBSTRING([GLJED].[TRANSREF], -CHARINDEX('-', [GLJED].[TRANSREF]) + 2, LEN([GLJED].[TRANSREF])) 

--Return "Value1" for "Value1-Value2-Value3" 
--Return "LonelyValue" for "LonelyValue" 

그러나,이 트릭은 무례한 행동을 할 것이다.

+0

이것은 위대한 일을했다. 정말 고마워 !! – user1486004

관련 문제