选择检索值的子字符串

时间:2014-05-31 10:28:59

标签: sql sql-server sql-server-2008

考虑下表:

MyValue
--------------------
123
122_DELETED
45670
42425
43_NO_VIEW
4365463_CORRUPT
53
4335_NO_VIEW_ALLOWED

我试图只获得返回的数字。换句话说:在第一个下划线(_)之后输入所有内容:

select
  left(MyValue, charindex(('_', MyValue)-1)
from
  DB.Table

但是,这会返回错误Invalid length parameter passed to the LEFT or SUBSTRING function.我认为这是因为如果当前值没有下划线(例如,NULL),则值为123

我如何解释此例外情况?非常感谢任何帮助。

我在SQL Server 2008上。

5 个答案:

答案 0 :(得分:3)

select SUBSTRING(MyValue,CHARINDEX('_',MyValue)+1,LEN(MyValue)) from DB.Table

答案 1 :(得分:3)

试试这个

select
    case when MyValue is null then '' --if null return empty string
    when charindex('_', MyValue) > 0 then
        left(MyValue, charindex('_', MyValue)-1)
    else
        MyValue --Return the field value if an underscore is not present
    end as Result

from
  DB.Table

答案 2 :(得分:3)

试试这个!

select myval,case when myval like '%[_]%' then
substring(myval,1,patindex('%[_]%',myval)-1) else myval end from t

## DEMO USING PATINDEX

## DEMO USING CHARINDEX

答案 3 :(得分:1)

试试这个:

  declare @st varchar(20)
set @st ='4365463_CORRU'    
select @st, SUBSTRING(@st,CHARINDEX('_',@st)-LEN(@st),LEN(@st))

答案 4 :(得分:1)

检查一下。

declare @t table (myvalue varchar(50))

insert into @t
values ( '123'),('122_DELETED'),('45670'),('42425'),('43_NO_VIEW'),('4365463_CORRUPT'),('53'),('4335_NO_VIEW_ALLOWED')


select * from @t

;With  cte as
(
    select CHARINDEX( '_', myvalue)+1 d , myvalue from @t
)
select SUBSTRING(myvalue,d,LEN(myvalue) ) from cte