使用LEFT结合CHARINDEX在从表

时间:2017-04-18 23:37:06

标签: sql sql-server tsql charindex

我尝试使用LEFT结合CHARINDEX从表中的列中提取子字符串但是它给出了以下错误

  

消息537,级别16,状态2,行1传递给的长度参数无效   LEFT或SUBSTRING功能。

select name, left(name, charindex('\',name) - 1) as sub
from sys.servers

但是,如果我使用变量在单个字符串上应用相同的字符串,那么它就可以工作..

declare @mytext varchar(max)
set @mytext = 'hello\world'
SET @MyText = LEFT(@MyText, CHARINDEX('\', @MyText) - 1)
print @mytext

O/P:
----
hello

请让我知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

问题是name可能没有反斜杠。这很容易修复,但这取决于你想要的结果。当没有反斜杠时,这会给出全名:

select name,
       left(name, charindex('\', name + '\') - 1) as sub
from sys.servers;

问题是charindex()在值不存在时返回0 - 这是left()的长度错误。

答案 1 :(得分:0)

你可以做的是使用IIF for SQL 2012 +或Case来避免文本中没有'\'时的错误

declare @mytext varchar(max)
set @mytext = 'hello world'
SET @MyText = LEFT(@MyText, iif(CHARINDEX('\', @MyText)>0,CHARINDEX('\', @MyText) - 1,len(@mytext)))
print @mytext

CASE

SET @MyText = LEFT(@MyText,
CASE
  WHEN CHARINDEX('\', @MyText) > 0 THEN CHARINDEX('\', @MyText) - 1
  ELSE LEN(@mytext)
END)

PRINT @mytext

答案 2 :(得分:0)

如果在名称中找不到'\',它将给出0,因此最终结果将保留(name,-1),这是无效的。因此,您需要以这样的方式编写代码:如果存在-1,则需要将其视为0.下面的代码修复了该问题。

select name, left(name, ISNULL(NULLIF(charindex('\',name) - 1,-1),0)) as sub from sys.servers