读取sql中char后面的每个字符串

时间:2016-07-08 06:01:48

标签: sql sql-server-2008 tsql

所以我们假设你有一个字符串:

set @string = 'aaa,2,dqw,3,asdad,5,4'

我想阅读一个字母和一个“,”之后的字符。 所以这个字符串的结果是:

 Result
--------
  2
  3
  5

我怎么能这样做?有没有办法使用CHARINDEX呢?

2 个答案:

答案 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