2017-10-11 7 views
2

各文字列を分割し、それぞれを別々の行に表示したいとします。また、文字が数字かどうかを表示する必要がある余分な列(Col2)が必要です(数値の場合は1、それ以外の場合は0)。データは '2017年10月11日' である場合、私は一つの方法は、再帰CTEを使用していますSQL:文字を分割して別の行に表示するにはどうすればいいですか?

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 

答えて

1

を取得する必要があります

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

uが投稿する前に答えを確認する必要があります。 –

+0

再帰的クエリ "cte"の "letter"列のアンカーと再帰的部分の型が一致しません。 –

+0

エラーメッセージの表示:再帰的クエリ "cte"の "letter"列のアンカーと再帰的部分の型が一致しません。 –

3

はこれを試してみてください:

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

作業中です。ありがとう! –

2

あなたはこれを使用することができます。

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 
関連する問題