嵌套大小写错误传递给LEFT或SUBSTRING函数的长度参数无效

时间:2016-09-28 19:33:26

标签: sql sql-server

我不像我想的那样精通SQL。我正在尝试使用以下案例将“供应商名称”和“供应商编号”包含在报表中。

供应商编号

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]中缺少“ - ”。[TRANSREF]。

我试图寻找不同的方法,但我做错了。如果我删除“-1”,查询运行但不会给我我正在寻找的数据。我需要“ - ”左侧的数据来查找供应商名称和编号。

如果CHARINDEX(' - ',[GLJED]。[TR​​ANSREF])= 0,我已经尝试在select语句中添加另一个案例但是我必须把它放在错误的位置。

温柔,我一直在寻找!

2 个答案:

答案 0 :(得分:0)

就像你说的那样,缺少“ - ”会使长度无效,因为在这种情况下CHARINDEX会返回0。添加减1会使LEFT函数的长度无效。

使用substring和和IndexOf,您将不会遇到此问题。 但是,当缺少“ - ”时,它将返回“空”字符串。

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”来处理这种情况。

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"

或者为了避免处理这种特殊情况的“情况”,你可以使用以下技巧。

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

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

但是,如果你的值以空格开头或结尾,这个技巧会出错,因为Len不计算它们。

答案 1 :(得分:0)

CHARINDEX('-',[GLJED].[TRANSREF])-1中没有 - (连字符)时,

-1[GLJED].[TRANSREF]

所以你可以修改几种方法,一种方法是在你的嵌套选择中添加一个案例:

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

因为你在case语句中有一个嵌套选择我会假设你的查询可能会使用一些工作,但只是能够修改我能看到的内容:

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