Sql 使用Left和char索引返回的参数无效
当我组合left和charindex时,我得到的left参数无效 我的行返回类似productname、productupc或其他文本的内容 我只想获得产品名称 因此,通过使用charindex,我可以得到第一个逗号之前的总字符数 使用charindex(“,”,[列名]) 范例 [productinformation]用于列名 这是返回的完整列Sql 使用Left和char索引返回的参数无效,sql,sql-server,Sql,Sql Server,当我组合left和charindex时,我得到的left参数无效 我的行返回类似productname、productupc或其他文本的内容 我只想获得产品名称 因此,通过使用charindex,我可以得到第一个逗号之前的总字符数 使用charindex(“,”,[列名]) 范例 [productinformation]用于列名 这是返回的完整列 select [productinformation] from testTable 蓝色小部件,1313138300件装在一个盒子里 sele
select [productinformation] from testTable
蓝色小部件,1313138300件装在一个盒子里
select charindex(',',[productinformation]) from testTable
将返回12
使用
从testTable中选择left([productinformation])、charindex('、'、[productinformation])
返回
blue widget,
Invalid length parameter passed to the LEFT or SUBSTRING function
使用
从testTable中选择charindex(','[productinformation])-1
返回11
所以我假设从charindex中减去一个,就得到了产品名称
SELECT left([productinformation],charindex(','[productinformation])-1) FROM testTable
返回
blue widget,
Invalid length parameter passed to the LEFT or SUBSTRING function
函数只接收正整数
整数表达式
是一个正整数,指定返回字符\表达式的字符数。如果整数_表达式为负数,则返回错误。如果整型_表达式的类型为bigint且包含大值,则字符_表达式必须为大数据类型,如varchar(max)
因此,如果您的CHARINDEDX()
没有找到该字符,它将返回0
,并且您添加-1
,因此0-1
即-1
那将抛出一个错误
传递给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
函数只接收正整数
整数表达式
是一个正整数,指定返回字符\表达式的字符数。如果整数_表达式为负数,则返回错误。如果整型_表达式的类型为bigint且包含大值,则字符_表达式必须为大数据类型,如varchar(max)
因此,如果您的CHARINDEDX()
没有找到该字符,它将返回0
,并且您添加-1
,因此0-1
即-1
那将抛出一个错误
传递给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
如果未找到参数,
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
如果未找到参数,
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
你可以试试子串
SELECT
SUBSTRING([productinformation], 0, CHARINDEX(',', [productinformation])) FROM testTable
你可以试试子串
SELECT
SUBSTRING([productinformation], 0, CHARINDEX(',', [productinformation])) FROM testTable
0减1等于多少
select left('不相关的文本',charindex(',','不包含逗号的文本值')-1)
charindex(','[productinformation])中缺少的逗号。只是您问题中的一个输入错误吗?0减去1是什么select left('不相关的文本',charindex(',','不包含逗号的文本值')-1)
是charindex(','[productinformation])中缺少的逗号。
只是您问题中的一个输入错误?如果您在case语句的else子句中添加-1,这是正确的。感谢您捕捉到@jyao,我更新了我的帖子以省略输入错误。如果CHARINDEX()返回0怎么办?在您的代码中,它的意思是1-1=0,这将给出错误的结果,因为该字符存在。@Sami如果CHARINDEX返回0,则代码将在CASE语句的第一个条件下退出,该条件将对此进行检查,并且只使用列的长度而不减去1。无法访问后续的ELSE。如果在case语句的ELSE子句中添加-1,这是正确的。感谢您捕捉到@jyao,我更新了我的帖子以省略输入错误。如果CHARINDEX()返回0怎么办?在您的代码中,它的意思是1-1=0,这将给出错误的结果,因为该字符存在。@Sami如果CHARINDEX返回0,则代码将在CASE语句的第一个条件下退出,该条件将对此进行检查,并且只使用列的长度而不减去1。后续的ELSE将无法到达。您只需指出错误的原因,但如果您同时提供解决方案会更好。您只需指出错误的原因,但如果您同时提供解决方案会更好。