2016-09-28 27 views
0

私は、SQLに精通していません。私は、次のケースを使用して、「ベンダー名」と「ベンダー番号」をレポートに含めることを試みています。ネストされたケースエラー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 
問題がある

、私は取得していますエラー

"LEFTまたはSUBSTRING関数に渡された無効な長さのパラメータ。"

[GLJED]。[TR​​ANSREF]にトランザクションに「 - 」がないためです。

私はこれを回避するさまざまな方法を試してみましたが、何か間違っています。 "-1"を削除するとクエリが実行されますが、探しているデータが表示されません。ベンダーの名前と番号を見つけるには、 " - "の左側のデータが必要です。

CHARINDEX( ' - '、[GLJED]。[TR​​ANSREF])= 0の場合、別のケースをselect文の中に入れてみましたが、間違った場所に置く必要があります。

穏やかに、私は探しています!

+0

おそらくCHARINDEX( ' - '、[GLJED][TRANSREF]) - [GLJED]。[TR​​ANSREF]に - がないときは-1です。 – Matt

+0

私はそれが欠落していることがわかりました。 " - "、そして基本的にエラーの原因となっている "0 - 1"と言っています。私はちょうどまだそれを修正する方法を見つけていない – user1486004

答えて

0

CHARINDEX('-',[GLJED].[TRANSREF])-1はに - (ハイフン)が含まれていない場合は-1です。

だから、あなたはいくつかの方法を修正することができ、1はケースを追加することであるあなたのネストされたSELECT:あなたはcase文で選択ネストされている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を使用すると、この問題は発生しません。 しかし、 " - "がない場合は "空"文字列を返します。 " - " そのような場合に対処するために不足している、あなたは "WHEN 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" 

EDIT。

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" 

また、この特定のケースを処理する「ケース」がないようにするには、次のトリックを使用できます。お使いの値が開始またはスペース(S)で終わる場合Lenはそれらをカウントされませんので、

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

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

しかし、このトリックは、不正な動作します。

+0

これは素晴らしいも働いて、ありがとう! – user1486004

関連する問題