返回字符串的特定部分

时间:2014-08-21 15:16:34

标签: sql string tsql

问题:数字#中的当前输入; VARCHAR

例如: 404#;购买订单

1#; b采购订单

1046#; x y x来自该公司的采购订单

我需要将开头的数字放在一列中,并在#后面加上字段的名称;在另一列。

Parse不起作用,因为标题中可能有超过4个单词

你可以看到#;是所有输入中的常见功能。

我希望看到的是:

ID           Name
404          a purchase order
1            b purchase order
1046         xyz purchase order from this company 

有什么想法吗?

我尝试了How do I split a string so I can access item x?

但这对我不起作用

3 个答案:

答案 0 :(得分:3)

declare @a varchar(20)
set @a = '123#;gunrin gnre'

SELECT 
    SUBSTRING(@a,0,CHARINDEX('#',@a)) AS ID
    , SUBSTRING(@a,CHARINDEX('#',@a)+2,LEN(@a)-CHARINDEX('#',@a)) AS Name

答案 1 :(得分:1)

Declare @Sample NVARCHAR(100)

 SET @Sample = '1046#;x y x purchase order from this company'

SELECT SUBSTRING(@Sample, 1, CHARINDEX('#;', @Sample)-1), SUBSTRING(@Sample, CHARINDEX('#;', @Sample)+2,LEN(@Sample) )

答案 2 :(得分:0)

怎么样:

with Test as (
    select * from (values 
        ('404#;a purchase order'),
        ('1#;b purchase order'),
        ('1046#;xyz purchase order from this company'),
        ('29323982#;evil test 231#;')
    ) tmp(str)        
)
select cast(left(str, idx-1) as int) as ID,
       right(str, len(str)-idx-1)    as Name
from Test t
cross apply (select charindex('#;', t.str) as idx) tmp

-- ID          Name
-- ----------- ------------------------------------------
-- 404         a purchase order
-- 1           b purchase order
-- 1046        xyz purchase order from this company
-- 29323982    evil test 231#;
-- 
-- (4 row(s) affected)

请记住,cross apply是特定于MSSQL的。