从SQL Server上的String中提取int

时间:2014-06-23 15:40:24

标签: sql sql-server

我试图提取一个跟随红衣主教的号码"#"来自sql server中的String。另外,我想忽略所有未附加到"#"的数字。辛博尔。为此我创建了这样的东西:

DECLARE @val nvarchar(50)

SET @val = '#5777 some text'

PRINT SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, 
    PATINDEX('%[^0-9]%', SUBSTRING(@val, 
        PATINDEX('%#[0-9]%', @val) + 1, LEN(@val))) - 1)


----------
@val = '#5777 some text':
result = 5777
@val = '#5777'
result = error

如果将数字作为一些文本后面的数字,但是如果数字是最后一个字符,我可以得到一个错误说明:

" 传递给LEFT或SUBSTRING函数的长度参数无效 "

当然,我可以这样做:

DECLARE @val nvarchar(50)

SET @val = '#5777'

PRINT SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, 
    CASE WHEN PATINDEX('%[^0-9]%', SUBSTRING(@val, 
        PATINDEX('%#[0-9]%', @val) + 1, LEN(@val))) = 0 THEN
        LEN(@val) ELSE
        PATINDEX('%[^0-9]%', SUBSTRING(@val, 
        PATINDEX('%#[0-9]%', @val) + 1, LEN(@val))) - 1
        END)

----------
result = 5777

所以我的问题是:有没有办法以更简单,更有效的方式实现这个目的?

谢谢

3 个答案:

答案 0 :(得分:0)

DECLARE @val nvarchar(50)

SET @val = '#5777 some text'

PRINT REPLACE(@val, SUBSTRING(@val, PATINDEX('%[^a-zA-Z0-9 ]%', @val), 1), '')

答案 1 :(得分:0)

有点hacky,但它适用于您的两个场景(以下文字,没有后续文字):

DECLARE @val nvarchar(50)

SET @val = '#5777 some text'
PRINT SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, 
    ISNULL(NULLIF((PATINDEX('%[^0-9]%', SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, LEN(@val))) - 1),-1),100))

SET @val = '#5777'

PRINT SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, 
    ISNULL(NULLIF((PATINDEX('%[^0-9]%', SUBSTRING(@val, PATINDEX('%#[0-9]%', @val) + 1, LEN(@val))) - 1),-1),100))

答案 2 :(得分:0)

如果您要定期解析字符串,请在工具箱中添加string-splitting function

SELECT string
FROM dbo.SplitString(@value,' ')
WHERE
  string LIKE '#'+REPLICATE('[0-9]',LEN(string)-1)