2015-08-15 108 views
1

将NVARCHAR与数字拆分为int的最简单方法是什么?例如“123”中的1,2和3。从字符串TSQL获取数字

+2

你能给出一个完整的你想要做什么的例子?把它分成几行?列?别的东西? – Mureinik

+0

使用专门设计的工具,如脚本语言。 –

回答

1

作为一个说明,你也可以用递归CTE做到这一点:

with val as (
     select '123' as val 
    ), 
    cte as (
     select left(val, 1) as c, substring(val, 2, len(val)) as rest 
     from val 
     union all 
     select left(rest, 1), substring(rest, 2, len(rest)) 
     from cte 
     where rest <> '' 
    ) 
select c 
from cte; 
+0

查理罗森菲尔德,如果你有像'123'小字符串。我认为你应该使用戈登的解决方案而不是上面的解决方案,这将会更快。 @Gordon Linoff:我对'Gordon'专员吗? 另一方面,我是一位粉丝。我已阅读过您提供的许多解决方案。 –

+0

如果传入一个空字符串,将返回一个空字符串的单行。通过在'cte'中向anchor成员添加'where len(val)> 0',可以轻松地进行更改。出于好奇,我试着改变递归CTE来使用'substring'来提取字符和计数来移动字符串,从而避免了'rest'的开销。结果是:执行计划完全一样。 – HABO

+0

@DeepanshuKalra。 。 。要看哪个更快,你需要做一个时间比较。我添加了这个以防万一使用'master..spt_values'的人感到不舒服。在一个小字符串,它可能会更快,但我不知道。 –

9

假设您希望它'将其拆分为多行'。您可以使用下面的代码:

DECLARE @var varchar(10) = 123; 
--DECLARE @var varchar(10) = 'charlie'; 

SELECT SUBSTRING(Temp.input, v.number+1, 1) 
FROM (SELECT @var input) Temp 
JOIN MASTER..spt_values v ON v.number < LEN(Temp.input) 
WHERE v.TYPE = 'P' 

输出:

enter image description here

+1

非常巧妙的解决方案+1 –