我试图提取一个跟随红衣主教的号码"#"来自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
所以我的问题是:有没有办法以更简单,更有效的方式实现这个目的?
谢谢
答案 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)