当我结合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
答案 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