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。
答
试试这个:
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
ü应先检查答案。 –
类型在递归查询“cte”的列“字母”的锚和递归部分之间不匹配。 –
获取错误消息:类型在递归查询“cte”的列“字母”的锚和递归部分之间不匹配。 –