所以我们假设你有一个字符串:
set @string = 'aaa,2,dqw,3,asdad,5,4'
我想阅读一个字母和一个“,”之后的字符。 所以这个字符串的结果是:
Result
--------
2
3
5
我怎么能这样做?有没有办法使用CHARINDEX
呢?
答案 0 :(得分:3)
如果您的字符串与您的示例相似,则使用Charindex(&#39;,&#39;,<string>
)也可以。
否则,请使用PATINDEX。它的功能类似,但您也可以将其设置为识别所有数字字符。
IF PATINDEX('%[0-9]%', @String') <> 0
THEN BEGIN
SET @string = SUBSTRING(@string, PATINDEX('%[0-9]%', @string), LEN(@string) )
SET @var = SUBSTRING(@string, PATINDEX('%[^0-9]%', @string) )
END
您现在可以随意使用这些变量。
对于您的例外,只需再使用一个case语句并删除它。没有理由代码必须太复杂。
答案 1 :(得分:0)
使用数字表和split string functions
的另一种方法declare @string varchar(max)
set @string = 'aaa,2,dqw,3,asdad,5,4'
;with cte
as
(
select * from [dbo].[SplitStrings_Numbers](@string,',')
)
select
* from cte where isnumeric(item)=1
<强>输出:强>
2
3
5
4
如果您确定数据中没有特殊字符..您可以在上面使用,但有时使用NUMERIC会将某些字符显示为数字
SELECT
ISNUMERIC('123') as '123' --1
,ISNUMERIC('.') as '.' --Period ---1
,ISNUMERIC(',') as ',' --Comma ---1
在这种情况下,您可以使用SQL Server 2012提供的TRY_Parse ..
declare @string varchar(max)
set @string = 'aaa,2,dqw,3,asdad,5,4'
;with cte
as
(
select b.* from [dbo].[SplitStrings_Numbers](@string,',') a
cross apply
(select try_parse(a.item as int) ) b(val)
)
select
* from cte where val is not null