SQL:如何分割每个字符的字符串以显示在单独的行中?

SQL:如何分割每个字符的字符串以显示在单独的行中?

问题描述:

我想在每个字符处分割一个字符串,并将它们中的每一个显示在单独的行中。我还需要一个额外的列(Col2),它应该显示字符是否是数字(如果是数字,那么1就是0)。SQL:如何分割每个字符的字符串以显示在单独的行中?

例子:

如果数据是 '2017年10月11日',我应该得到

Col1 Col2 
O 0 
c 0 
t 0 
o 0 
b 0 
e 0 
r 0 
    0 
1 1 
1 1 
, 0 
    0 
2 1 
0 1 
1 1 
7 1 

一种方法是使用递归CTE:

with cte as (
     select cast('October 11, 2017' as varchar(max)) as str, 
      cast(NULL as varchar(max)) as letter, 0 as lev 
     union all 
     select substring(str, 2, len(str)), left(str, 1), lev + 1 
     from cte 
     where str <> '' 
    ) 
select letter, 
     (case when letter between '0' and '9' then 1 else 0 end) as is_digit 
from cte 
where lev > 0; 

如果字符串可以有超过99个字符,那么你会想使用最大递归选项。

Here是Rextester。

+0

ü应先检查答案。 –

+0

类型在递归查询“cte”的列“字母”的锚和递归部分之间不匹配。 –

+0

获取错误消息:类型在递归查询“cte”的列“字母”的锚和递归部分之间不匹配。 –

试试这个:

CREATE TABLE tbSeperate (Data NVARCHAR(100)) 

INSERT INTO tbSeperate SELECT 'October 11, 2017' 

SELECT SUBSTRING(Data,Number,1) rt , CASE WHEN TRY_CAST(SUBSTRING(Data,Number,1) AS INT) IS NULL THEN 0 
WHEN SUBSTRING(Data,Number,1) = ' ' THEN 0 ELSE 1 END c FROM tbSeperate 
CROSS APPLY (SELECT DISTINCT number FROM master..spt_values WHERE number > 0 AND number <= LEN(Data))V 
+0

正在工作。谢谢! –

您可以使用此。

DECLARE @data VARCHAR(100) = 'October 11, 2017' 

;WITH CTE AS 
(
    SELECT STUFF(@data,1,1,'') TXT, LEFT(@data,1) Col1 

    UNION ALL 

    SELECT STUFF(TXT,1,1,'') TXT, LEFT(TXT,1) Col1 FROM CTE 
    WHERE LEN(TXT) > 0 
) 
select Col1, ISNUMERIC(Col1) from CTE 

结果:

Col1 Col2 
---- ----------- 
O 0 
c 0 
t 0 
o 0 
b 0 
e 0 
r 0 
    0 
1 1 
1 1 
, 1 
    0 
2 1 
0 1 
1 1 
7 1