使用Left和char索引返回无效参数

时间:2019-01-08 17:59:22

标签: sql sql-server

当我结合left和charindex时,得到的参数参数left

我的行返回诸如productname,productupc和其他一些文字 我只想获取产品名称

因此,通过使用charindex,我可以获得直到第一个逗号为止的总字符数

使用charindex(',',[列名])

示例

[productinformation]列名称

这是返回的完整列

 select [productinformation] from testTable

蓝色小部件1313138,一盒300个

 select charindex(',',[productinformation]) from testTable

将返回12

使用      从testTable中选择left([productinformation]),charindex(',',[productinformation]))

返回

 blue widget,

使用      从testTable中选择charindex(','[[productinformation])-1 返回11

所以我认为从charindex减去1只会得到产品名称。

 SELECT  left([productinformation],charindex(','[productinformation])-1) FROM testTable

返回

 Invalid length parameter passed to the LEFT or SUBSTRING function

3 个答案:

答案 0 :(得分:2)

LEFT() 函数仅接收正整数

  

integer_expression   是一个正整数,指定将返回character_expression的多少个字符。如果integer_expression为负,则返回错误。如果integer_expression的类型为bigint并且包含较大的值,则character_expression必须为大型数据类型,例如varchar(max)。

因此,如果您的CHARINDEDX()找不到字符,它将返回0,并添加-1,因此0-1-1。 / p>

那会抛出一个错误

  

传递给LEFT或SUBSTRING函数的长度参数无效

您需要检查返回的值是否为正值

SELECT LEFT([productinformation],
            CASE WHEN CHARINDEX(',',[productinformation]) > 1
                 THEN CHARINDEX(',',[productinformation]) - 1
                 WHEN CHARINDEX(',',[productinformation]) = 1
                 THEN 1
                 ELSE LEN([productinformation]) --if you want to return it all otherwise 0
                 -- if you set it to 0 it will return ''
            END
           )
FROM testTable

答案 1 :(得分:1)

如果未找到参数,CHARINDEX将返回0,因此LEFT函数将被赋予负值(当从0中减去1时),这就是导致无效长度错误的原因。您可以使用CASE..WHEN语句来避免这种情况。

SELECT LEFT([PRODUCTINFORMATION],
CASE WHEN CHARINDEX(',', [PRODUCTINFORMATION]) = 0 THEN LEN([PRODUCTINFORMATION]) ELSE
CHARINDEX(',', [PRODUCTINFORMATION]) - 1 END) AS PRODUCTINFORMATION
FROM TESTTABLE

答案 2 :(得分:0)

您可以尝试子字符串

SELECT 
SUBSTRING([productinformation], 0, CHARINDEX(',', [productinformation])) FROM testTable